从列表映射中检索问题

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); }

然而,每次调用该函数时,使用相同的索引,返回的不是相同的列表,而是一个空列表。

我做错了什么?

预计时间:我发现每次调用该函数后字典中的值数量都会增加。这可能与 [] 操作符有关吗?

5个回答

6

你的地图中的键是指针值,而不是它的内容。因此会出现奇怪的行为。将地图更改为其键为std::string。另外,你修改了存储列表的副本。要避免这种情况,请使用引用。

list<Show>& ls = map[index]

1

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

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

同时确保您正在编辑存储在映射中的列表,而不是它的副本,就像其他人所说的那样 :) - Stuart Golodetz

1

你需要使用一个引用:

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

否则你会创建一个临时副本并向其添加内容。

你看到映射中的项目数量增加,是因为每次搜索不同的指针,即使它指向相同的值。如果使用operator[],这样做会在失败时添加一个空值。

你需要比较实际的值(通过定义一个比较器传递给映射构造函数),或者使用std::string作为键。


0
当你写下 list<Show> lshow = _shows[index] 时,实际上是在复制映射中找到的列表。你需要的是对该列表的引用:list<Show> &lshow = _shows[index]

0

lshow_shows[index]的副本。尝试使用_shows[index].push_back(s),否则将_shows[index]作为引用

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

还要考虑将 _shows 重命名,因为以下划线开头的名称通常保留给标准库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接