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 groupsit 迭代器指向 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中使用迭代器。因为iteratorpointer 不一样。迭代器是用于迭代的,应该被认为是瞬态的,而不是存储供以后使用。

【讨论】:

以上是关于unordered_map 迭代器指向 end(),如何从 unordered_map 中检索键?的主要内容,如果未能解决你的问题,请参考以下文章

3.4迭代器介绍

反向迭代器

迭代 unordered_map 时如何获取指向键的指针?

迭代器基本

unordered_map 迭代器会改变吗?

为啥允许 std::unordered_map::rehash() 使迭代器无效?