0

我必须从头到尾对 std::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.begin()元素是否正常?

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

  • 怎么可能operator++允许在无限循环中悄悄失败?返回错误代码(我们禁用异常)或以某种方式公开失败不是更好吗?

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

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

编辑:

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

4

1 回答 1

2

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

不,您应该正确初始化它:

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

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

于 2017-12-08T12:37:04.417 回答