2010-11-08 1 views
3

В моей программе, у меня есть карта со строковыми ключами и списка (через определенный пользователем класс) значений, определяемый следующим образом:Проблема извлечения из карты списков

std::map<const char*, std::list<Show>> _shows; 

У меня есть функция, которая добавляет к конкретный список, например, так:

void Add(Show s, const char* index) { 
list<Show> lshow = _shows[index]; 
lshow.push_back(s); } 

Однако каждый раз, когда функция вызывается с тем же индексом, а не возвращать тот же самый список, я получаю пустой список.

Что я делаю неправильно?

ETA: Я вижу, что количество значений в словаре увеличивается после каждого вызова функции. Может ли это быть [] связанным с оператором?

ответ

6

Ключ на вашей карте - это значение указателя, а не его содержимое. Поэтому странное поведение. Измените карту так, чтобы ее клавиша была std::string. Кроме того, вы изменяете копию своего сохраненного списка. Чтобы избежать этого, используйте ссылку

list<Show>& ls = map[index] 
1

Вы должны использовать ссылку:

list<Show>& lshow = _shows[index]; 

Поскольку в противном случае вы создаете временную копию и добавление к нему.

Вы видите количество элементов на карте, потому что каждый раз ищете другой указатель , даже если он указывает на то же значение. Если вы используете operator[], это добавляет пустое значение.

Вам необходимо сравнить фактические значения (путем определения компаратора, который вы передаете конструктору карты), или использовать std::string s в качестве ключей.

0

Когда вы пишете list<Show> lshow = _shows[index], вы на самом деле делаете копию списка, найденного на вашей карте. Что вы хотите, это ссылка в этом списке: list<Show> &lshow = _shows[index].

1

Вы используете const char * как ключ std :: map. Карта сортируется по адресам указателей, а не по указательным строкам. Чтобы получить нужное поведение, используйте:

std::map<std::string,std::list<Show> > 
+0

А также убедитесь, что вы редактируете список, хранящийся на карте, а не его копию, как говорят все остальные :) –

0

lshow является копией _shows[index]. Попробуйте _shows[index].push_back(s), или же взять _shows[index] как ссылки:

std::list<Show> &lshow = _shows[index]; 
lshow.push_back(s); 

Также рассмотреть переименование _shows, потому что имена, начинающиеся с символа подчеркивания, как правило, зарезервированы для стандартной библиотеки.