在我的程序中,我有一个带有字符串键和列表(用户定义类)值的映射,定义如下:
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:我看到每次调用函数后字典中的值都会增加。这可能与[]运算符有关吗?
答案 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
,因为以下划线开头的名称通常是为标准库保留的。