【问题标题】:C++ How to loop through set in map?C ++如何循环遍历地图中的集合?
【发布时间】:2014-11-19 09:54:09
【问题描述】:

我在学校项目中遇到了一个问题:我需要一组映射到键号的数字。 ZZ 是 NTL 库中的大整数类,但这并不重要。我的程序在内部循环中总是失败,并显示it_set2 无法迭代。

std::map<ZZ, std::set<ZZ>> mapa;  
std::map<ZZ, std::set<ZZ>>::iterator it_map;  
std::set<ZZ>::iterator it_set1, it_set2;    

for (it_map = mapa.begin(); it_map != mapa.end(); ++it_map) {       
    for (it_set1 = it_map->second.begin(); it_set1 != it_map->second.end(); ++it_set1) {
        for (it_set2 = ++it_set1; it_set2 != it_map->second.end(); ++it_set2) {
            /*
            some function that uses *it_set1, *it_set2
            */
        }
    }
}

感谢您的帮助。

【问题讨论】:

  • 您的示例正在为我编译和运行。 (ideone.com/mi2bFV)
  • @tgmath:仅适用于空地图。我猜 OP 的地图不是空的 ;)
  • 那么一个失败的例子可能会有所帮助。 :)

标签: c++ map set containers


【解决方案1】:

我想问题出在最内部的循环中。如果您希望it_set2 指向it_set1 当前指向的下一个元素(但实际上不增加it_set1),那么您应该将第三个循环更改为以下内容:for(it_set2 = it_set1; ++it_set2 != it_map-&gt;second.end(); )

这将确保您不会越界,也不会在不必要时增加it_set1

【讨论】:

  • A 也添加了这个if(*it_set1 == *it_set2){continue;},所以现在可以了。非常感谢。
【解决方案2】:

鉴于您提供的信息,我怀疑您在第二个循环中点击最后一个 set 元素时遇到了问题。一旦你迭代了最后一个,第三个循环增加 it_set1 ,然后是 end 迭代器(当你查看最后一个元素时)。第三个 for 循环终止,第二个循环执行它的过去体指令,即 ++it_set1 将迭代器移过 end,从而调用未定义的行为。

【讨论】:

  • 我通过添加 if(++it_set1 == it_map->second.end()){ break; 来改进我的代码在 lastloop 之前,但它没有帮助。你有解决办法吗?感谢您的反应。
  • @MatejProcházka:提供一个人们可以重现的完整示例。否则,没人能帮你。
猜你喜欢
  • 1970-01-01
  • 2011-06-18
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
相关资源
最近更新 更多