C++ 从列表映射检索时出现问题
在我的程序中,我有一个带有字符串键和(用户定义类的)值列表的映射,定义如下:C++ 从列表映射检索时出现问题,c++,std,C++,Std,在我的程序中,我有一个带有字符串键和(用户定义类的)值列表的映射,定义如下: std::map<const char*, std::list<Show>> _shows; std::map\u显示; 我有一个添加到特定列表的函数,如下所示: void Add(Show s, const char* index) { list<Show> lshow = _shows[index]; lshow.push_back(s); } void添加(显示s,常量字
std::map<const char*, std::list<Show>> _shows;
std::map\u显示;
我有一个添加到特定列表的函数,如下所示:
void Add(Show s, const char* index) {
list<Show> lshow = _shows[index];
lshow.push_back(s); }
void添加(显示s,常量字符*索引){
列表lshow=_显示[索引];
lshow.push_(s);}
但是,每次使用相同的索引调用函数时,我都会得到一个空列表,而不是返回相同的列表
我做错了什么
ETA:每次调用函数后,字典中的值都会增加。这可能与[]运算符有关吗?您需要使用引用:
list<Show>& lshow = _shows[index];
list&lshow=_显示[索引];
否则,您将创建一个临时副本并添加到其中
您会看到地图中的项目数量增加,因为您每次都在搜索不同的指针,即使它指向相同的值。如果您使用的是操作符[]
,则此操作失败时会添加一个空值
您需要比较实际值(通过定义传递给映射构造函数的比较器),或者使用
std::string
s作为键。当您编写list lshow=\u显示[index]
时,您实际上是在复制映射中找到的列表。您需要的是此列表上的引用:list&lshow=\u显示[索引]
您正在使用常量字符*作为std::map键。映射按指针地址排序,而不是按指向的字符串排序。要获得您想要的行为,请使用:
std::map<std::string,std::list<Show> >
std::map
地图中的键是指针值,而不是其内容。因此行为怪异。更改映射,使其键为std::string
。此外,还可以修改存储列表的副本。要避免这种情况,请使用引用
list<Show>& ls = map[index]
list&ls=map[索引]
lshow
是\u shows[index]
的副本。尝试\u显示[索引]。向后推,或者将\u显示[索引]
作为参考:
list<Show>& lshow = _shows[index];
std::list&lshow=_显示[索引];
lshow.向后推_(s);
也考虑重命名<代码>显示,因为从下划线开始的名称通常保留在标准库中。
并且确保您正在编辑存储在地图中的列表,而不是每个人所说的副本。