C++ 默认构造的映射迭代器在增量-Green-Hills编译器上进入无限循环

C++ 默认构造的映射迭代器在增量-Green-Hills编译器上进入无限循环,c++,iterator,stdmap,greenhills,C++,Iterator,Stdmap,Greenhills,我必须从头到尾对std::map中的所有元素进行一次简单的迭代。在每个元素上,我必须执行一个操作。假设映射包含以下对: map<string,string> farm={ {"one","puppy"}, {"two","kitty"}, {"three","sheepy"} } 地图场={ {

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

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()

  • 如何允许
    操作符+++
    在无限循环中安静地失败?返回错误代码(我们禁用了 例外)或以某种方式公开失败

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

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

编辑:

我试图理解为什么我得到了一个有效的值和一个安静的失败,因为在其他线程中,人们建议将默认构造的迭代器分配给
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不要想得太多,