c++ - 默认构建的 map 迭代器在递增时进入无限循环 - Green Hills 编译器

标签 c++ iterator stdmap greenhills

我必须对 std::map 中的所有元素进行简单的迭代,从头到尾。我必须在每个元素上执行一个操作。假设 map 包含以下对:

map<string,string> farm={
                        {"one","puppy"},
                        {"two","kitty"},
                        {"three","sheepy"}
                       }

执行迭代的代码如下:

for(map<string,string>::iterator beast; beast!=farm.end(); ++beast) 
{
     feed(*beast);
}

现在令人惊讶的是,上面的代码适用于第一个元素(puppy 被喂食)但迭代器无法转到下一个元素。调试器显示 ++beast 永远不会返回(似乎它永远在其左叶上递归分支)。

这里的问题似乎是 beast 从未分配给 farm.begin() 因此它无法进入下一个项目(先看for 的元素)。

所以这是我的问题:

  • map 迭代器的默认构造函数自动将对象定位为指向 map.begin() 元素是否正常?

  • 如果这是常见的做法,那么为什么有效的第一个元素是 已返回(例如,它可能已返回 map.end())?

  • 如何允许 operator++ 在无限循环中安静地失败?返回错误代码会更好(我们禁用了 异常(exception))或以某种方式公开失败?

我想知道标准是否允许这种行为,或者它是一种实现选择。

假设:我没有使用 C++11,我使用的是禁用了执行支持的 Green Hills 编译器 v2016

编辑:

我试图理解为什么我得到一个有效值和一个安静的失败,因为在其他线程中人们建议将默认构造的迭代器分配给 map.end()。该标准是否对此提供了指导?

最佳答案

Is it normal that the default constructor of a map iterator automatically positions the object to point to the map.begin() element?

不,你应该正确地初始化它:

for(map<string,string>::iterator beast = farm.begin(); beast!=farm.end(); ++beast)

顺便说一句,编译器无法知道你想要 map<string,string>::iterator beast成为 farm 的迭代器,当然您需要从容器中获取迭代器,而不仅仅是创建迭代器并假设它指向您希望的容器。

关于c++ - 默认构建的 map 迭代器在递增时进入无限循环 - Green Hills 编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47714254/

相关文章:

c++ - 传递成员为 vector 的结构

c++ - 告诉 Windows 处理除一条消息以外的所有消息

java - 是否有与 C++ 的 std::map 等效的 Java Map keySet()?

c++ - std::cbegin() 除了 begin() 一个 const 引用之外还有别的吗?

c++ - 错误 : no matching function for call to 'CustomerData::CustomerData()'

c++ - 以自定义类作为键的 std::map 始终返回 1 的大小

c++ - jsoncpp - 由于类型不完整,无法定义 Json::Reader

c++ - VS 立即窗口 "identifier undefined"查询带命名空间的 DLL 函数时

c++ - 如何在不将代码放入头文件的情况下处理任何迭代器?

c++如何将迭代器指针传递给需要引用对象的函数