Как сохранить список на карте в C ++? - PullRequest
0 голосов
/ 04 мая 2018

EDIT:

В случае, если вы столкнулись с этим, путаница была с отладчиком xcode, а не с самим кодом. Код в порядке


Впервые в C ++, но не в программировании.

Я не понимаю, почему значения этого списка не сохраняются, когда я вставляю их в карту.

main.cpp

#include <iostream>
#include <string>
#include <memory>
#include <list>
#include <map>

#include "Movie.h"
#include "Date.h"
#include "Cinema.h"

using namespace std;

int main()
{
    Cinema cinema;

    string name = "transformers";
    Movie * transformers = new Movie(name, 2018, 6, 10);
    list<int> times;
    times.push_front(1200);
    times.push_front(1600);

    cinema.addMovie(transformers, times);

    cinema.printShowTimes(transformers);

    return 0;
}

cinema.cpp

#include "Cinema.h"
#include "Movie.h"

using namespace std;

Cinema::Cinema() {
}

void Cinema::addMovie(Movie * movie, list<int> & movie_time) {
    running_movies.push_front(movie);
    movie_times.insert(pair< Movie *, list<int> >(movie, movie_time));
}

void Cinema::printShowTimes(Movie * movie) {
    MovieMap::iterator it = movie_times.find(movie);

    if(it != movie_times.end()) {
        list<int> times = it->second;
    }
}

cinema.h

#ifndef CINEMA_H
#define CINEMA_H

#include "Movie.h"
#include <list>
#include <map>

typedef std::map< Movie *, std::list<int> > MovieMap;
typedef std::list< Movie * > MovieList;

class Cinema
{
  public:
    Cinema();
    Cinema(Cinema &);
    void addMovie(Movie *, std::list<int> &);

    void movieRunningAt(Movie &, std::list<int> &);
    void printShowTimes(Movie *);

  private:
    MovieList running_movies;
    MovieMap movie_times;
};

#endif

Похоже, что мой фильм правильно сохраняется, но список времен - это просто мусорные значения в printShowTimes, даже если они существуют в функции addMovie.

breakpoint in code

У меня такое чувство, что оно связано с указателями, но мне они пока не очень удобны!

1 Ответ

0 голосов
/ 04 мая 2018

Код работает *.

Сделайте так, чтобы ваша функция печатала значения, и вы увидите, что вы получите желаемый результат:

void printShowTimes(Movie * movie) {
    MovieMap::iterator it = movie_times.find(movie);

    if(it != movie_times.end()) {
        list<int> times = it->second;
        for (auto v : times)
            std::cout << v << "\n";
    }
}

Обратите внимание, что C ++ предлагает std::unordered_map, который может удовлетворить ваши потребности («запросить фильм и найти его время»), так как порядок не имеет значения.


* Но он использует указатели тревожным образом. Рассмотрите возможность размещения в Code Review .

...