unordered_map 迭代器指向 end(),如何从 unordered_map 中检索键?
Posted
技术标签:
【中文标题】unordered_map 迭代器指向 end(),如何从 unordered_map 中检索键?【英文标题】:unordered_map iterator points to end(), how can I retrieve a key from unordered_map? 【发布时间】:2020-12-03 11:56:00 【问题描述】:我目前正试图从一个 groups 的 unordered_map 返回键值 only,它有一个 string 作为 key 和 字符串向量 作为我的 值。我目前遇到的问题是我的 unordered_map groups 的 it 迭代器指向 end() 并使我的陈述为假,永远不会返回我的 groupKey。我只能使用 hasNext 和 getNextHome 来遍历我的地图。所以 for 循环不能用于这个任务。 我已经在我的头文件中初始化了它们:
Home::Home()
iter = 0;
it = groups.begin();
private:
int iter; // the iterator
unordered_map<string, vector<string>>::iterator it; // iterator for the map
void Home::resetHomeIterator()
iter = 0;
it = groups.begin();
bool Home::hasNext()
if (iter == groups.size() && it == groups.end())
return false;
else if (iter < groups.size())
return true;
return false;
string Home::getNextHome()
if (hasNext() == false || it == groups.end())
resetHomeIterator();
it++;
string groupKey = it->first;
return groupKey;
每当我运行它时,it->first 都会给我一个错误,我无法“取消引用结束列表迭代器”,并且当我调试时,我从来没有得到 groupKey返回,它只是变为 false,所以我永远不会得到返回的密钥。
我正在尝试取回 groupKey 并在我的 main.cpp 文件( while (hasNext) )中为我的 hasNext 使用 while 循环,并以这种方式迭代键值。我知道我的 group 映射也不为空,我在使用调试器时看到它们被相应地放置。我试图解决它,但我不确定我是否得到它。我可能会遗漏一些东西。因为它是一个字符串,我怎样才能只检索密钥?
【问题讨论】:
迭代器用于迭代和瞬态使用。当底层集合被修改时,它们通常会失效,从而导致以后出现未定义的行为。 (从您显示的界面部分来看,看起来成对的向量比地图更适合您。) 这很令人困惑int iter; // the iterator
看起来您使用iter
作为大小。它不是一个迭代器
@molbdnilo,在这种情况下,除了 map 之外我不能使用其他任何东西):所以我不能使用 unordered_map 迭代器来访问密钥对吗?
【参考方案1】:
这个问题的主要原因是因为iter
超出范围。 groups
的元素编号从0
开始。 group.end()
指向连续空间中最后一个有效元素之后的位置。所以,iter
不应该变成group.size()
。
if (iter == groups.size()-1 && it == groups.end())
return false;
另外,不建议在Home
中使用迭代器。因为iterator
和pointer
不一样。迭代器是用于迭代的,应该被认为是瞬态的,而不是存储供以后使用。
【讨论】:
以上是关于unordered_map 迭代器指向 end(),如何从 unordered_map 中检索键?的主要内容,如果未能解决你的问题,请参考以下文章