C++ 默认构造的映射迭代器在增量-Green-Hills编译器上进入无限循环
我必须从头到尾对std::map中的所有元素进行一次简单的迭代。在每个元素上,我必须执行一个操作。假设映射包含以下对:C++ 默认构造的映射迭代器在增量-Green-Hills编译器上进入无限循环,c++,iterator,stdmap,greenhills,C++,Iterator,Stdmap,Greenhills,我必须从头到尾对std::map中的所有元素进行一次简单的迭代。在每个元素上,我必须执行一个操作。假设映射包含以下对: map<string,string> farm={ {"one","puppy"}, {"two","kitty"}, {"three","sheepy"} } 地图场={ {
map<string,string> farm={
{"one","puppy"},
{"two","kitty"},
{"three","sheepy"}
}
地图场={
{“一”,“小狗”},
{“两个”,“基蒂”},
{“三”,“希皮”}
}
执行迭代的代码位如下所示:
for(map<string,string>::iterator beast; beast!=farm.end(); ++beast)
{
feed(*beast);
}
for(映射::迭代器beast;beast!=farm.end();++beast)
{
饲料(*野兽);
}
现在令人惊讶的是,上面的代码适用于第一个元素(puppy
)但迭代器无法转到下一个元素。调试器显示,++beast
永远不会返回(似乎它永远在其左叶上递归分支)
这里的问题似乎是,beast
从未被分配到farm.begin()
,因此它无法前进到下一个项目(有关详细信息,请参阅本文档的第一个元素)
下面是我的问题:
- 映射迭代器的默认构造函数自动将对象定位为指向
元素,这正常吗map.begin()
- 如果这是常见的做法,那么为什么要使用有效的第一个元素呢
返回(例如,它可能已返回
)map.end()
- 如何允许
在无限循环中安静地失败?返回错误代码(我们禁用了 例外)或以某种方式公开失败操作符+++
map.end()
。本标准是否对此提供了指导
映射迭代器的默认构造函数是否正常
自动定位对象以指向地图。begin()
元素
否,您应该正确初始化它:
for(map<string,string>::iterator beast = farm.begin(); beast!=farm.end(); ++beast)
for(map::iterator beast=farm.begin();beast!=farm.end();++beast)
顺便说一句,编译器无法知道您希望map::iterator beast
成为farm
的迭代器,当然您需要从容器中获取迭代器,而不仅仅是创建迭代器并假设它指向您想要的容器
映射迭代器的默认构造函数是否正常
自动定位对象以指向地图。begin()
元素
否,您应该正确初始化它:
for(map<string,string>::iterator beast = farm.begin(); beast!=farm.end(); ++beast)
for(map::iterator beast=farm.begin();beast!=farm.end();++beast)
顺便说一句,编译器无法知道您希望
map::iterator beast
成为farm
的迭代器,当然您需要从容器中获取迭代器,而不仅仅是创建迭代器并假设它指向您希望的容器。未定义行为的可能重复,所以期待任何事情发生。@ AsasMaZa C++允许你做各种各样的事情,这些行为是未定义的。声明未连接到容器中的迭代器是有效代码。错误是你的,不是C++,允许ItActudio<代码> map::迭代器i的默认构造函数有什么意义;如果(useA)i=a.begin();否则i=b.begin()代码>不存在映射::end()。每个地图都有自己的。不允许比较源于不同映射的迭代器。可能的未定义行为的重复,所以期待任何事情发生。@ AsasMaZaC++允许您做各种未定义行为的事情。声明未连接到容器中的迭代器是有效代码。错误是你的,不是C++,允许ItActudio<代码> map::迭代器i的默认构造函数有什么意义;如果(useA)i=a.begin();否则i=b.begin()代码>不存在映射::end()。每个地图都有自己的。不允许您比较来自不同映射的迭代器。问题不是怎么做,问题是为什么它默认为有效值(.begin()),而不是默认为明显无效的值(例如.end())Tobi303您知道我为什么如此困惑。它怎么知道它应该指向农场,却给了我第一对有效的?也许这里还有其他问题……@Assimazza“问题是……”你应该每个问题问一个问题。我将注意力集中在第一个方面,因为其他人只是从一个错误的假设出发,即在存在未定义的行为(增加未初始化的迭代器)的情况下,可以对正在发生的事情进行推理on@Assimazza别想得太多了,这再简单不过了。如果beast
未初始化,则不允许执行++beast
。编译器注意到您违反了规则,可以做任何他认为不“默认为有效值”的事情。默认构造的迭代器具有奇异值;它既不能取消引用也不能递增。执行这两种操作的代码都有未定义的行为——您无法从中推断出任何有意义的行为。问题不是要做什么,问题是为什么它默认为有效值(.begin()),而不是默认为明显无效的值(例如.end())Tobi303您知道我为什么如此困惑。它怎么知道它应该指向农场,却给了我第一对有效的?也许这里还有其他问题……@Assimazza“问题是……”你应该每个问题问一个问题。我将注意力集中在第一个方面,因为其他人只是从一个错误的假设出发,即在存在未定义的行为(增加未初始化的迭代器)的情况下,可以对正在发生的事情进行推理on@Assimazza不要想得太多,