从列表地图中检索问题

时间:2010-11-08 12:48:50

标签: c++ std

在我的程序中,我有一个带有字符串键和列表(用户定义类)值的映射,定义如下:

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:我看到每次调用函数后字典中的值都会增加。这可能与[]运算符有关吗?

5 个答案:

答案 0 :(得分:6)

地图中的键是指针值,而不是其内容。因此奇怪的行为。更改地图,使其键为std::string。此外,您还修改了存储列表的副本。为避免这种情况,请使用参考

list<Show>& ls = map[index]

答案 1 :(得分:1)

您需要使用参考:

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

因为否则你正在创建一个临时副本并添加到它。

您看到地图中的项目数量会增加,因为您每次都在搜索不同的指针,即使它指向相同的值。如果您使用operator[],则执行此操作会在失败时添加空值。

您需要比较实际值(通过定义传递给地图构造函数的比较器),或使用std::string作为键。

答案 2 :(得分:1)

您使用const char *作为std :: map键。地图按指针地址排序,而不是指向字符串。要获得所需的行为,请使用:

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

答案 3 :(得分:0)

当您编写list<Show> lshow = _shows[index]时,您实际上正在制作地图中找到的列表的副本。您想要的是此列表中的参考:list<Show> &lshow = _shows[index]

答案 4 :(得分:0)

lshow_shows[index]的副本。试试_shows[index].push_back(s),或者将_shows[index]作为参考

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

同时考虑重命名_shows,因为以下划线开头的名称通常是为标准库保留的。