默认构建的地图迭代器在递增时进入无限循环 - Green Hills 编译器
Default constructed map iterator enters infinite loop on increment - Green Hills compiler
我必须对 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
永远不会 returns(似乎它永远在其左叶上递归分支)。
这里的问题似乎是 beast
从未分配给 farm.begin()
,因此它无法前进到下一个项目(请参阅 for 的第一个元素)。
所以这是我的问题:
map迭代器的默认构造函数自动定位对象指向map.begin()
元素正常吗?
如果这是常见的做法,那么为什么有效的第一个元素是
returned(例如可以 returned map.end()
)?
怎么能让operator++
在死循环中悄悄失败?使用错误代码 return 会更好(我们禁用了
例外)或以某种方式公开失败 ?
我想知道标准是否允许这种行为,或者它是一种实现选择。
假设:我没有使用 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
的迭代器,当然您需要从容器中获取迭代器,而不仅仅是创建一个迭代器迭代器并假设它指向你想要的容器。
我必须对 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
永远不会 returns(似乎它永远在其左叶上递归分支)。
这里的问题似乎是 beast
从未分配给 farm.begin()
,因此它无法前进到下一个项目(请参阅 for 的第一个元素)。
所以这是我的问题:
map迭代器的默认构造函数自动定位对象指向
map.begin()
元素正常吗?如果这是常见的做法,那么为什么有效的第一个元素是 returned(例如可以 returned
map.end()
)?怎么能让
operator++
在死循环中悄悄失败?使用错误代码 return 会更好(我们禁用了 例外)或以某种方式公开失败 ?
我想知道标准是否允许这种行为,或者它是一种实现选择。
假设:我没有使用 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
的迭代器,当然您需要从容器中获取迭代器,而不仅仅是创建一个迭代器迭代器并假设它指向你想要的容器。