【问题标题】:Can an STL map iterator go out of bounds through incrementing?STL 映射迭代器可以通过递增超出范围吗?
【发布时间】:2010-11-22 10:13:57
【问题描述】:

对于关联容器,++ 运算符是否可以将迭代器发送到集合的末尾?

例子:

map<UINT32, UINT32> new_map;
new_map[0] = 0;
new_map[1] = 1;

map<UINT32, UINT32> new_iter = new_map.begin();

++new_iter;
++new_iter;
++new_iter;
++new_iter;
++new_iter;
++new_iter;
++new_iter;

在这结束时,是 new_iter == new_map.end(),还是在巨大的未知中结束?

注意:我知道这是一团糟,而不是做事的方式。我正在处理一些 WTF 公司代码。

【问题讨论】:

标签: c++ stl


【解决方案1】:

正如其他人所指出的,增加结束迭代器会导致未定义的行为,但值得注意的是,如果您这样做,Visual Studio 2008 将在运行时抛出调试断言(由于其checked iterators)。

【讨论】:

    【解决方案2】:

    前向迭代器的 ++ 运算符的前提条件是迭代器是可解引用的。这意味着它不能超过地图的末尾,因此您的代码会给出未定义的行为。这在 C++ 标准的第 24.1.3 节中有所描述。

    【讨论】:

    • 24.2.3 实际上是输入迭代器,24.2.4 是输出。
    【解决方案3】:

    如果增加结束迭代器,结果是未定义的行为。因此,它可以保持结束,或者结束,或者通过电子邮件向您的祖母发送 goatse 的链接。

    另请参阅:What if I increment an iterator by 2 when it points onto the last element of a vector?

    【讨论】:

    • 你忘记了讨厌的鼻恶魔。 :)
    猜你喜欢
    • 2018-01-07
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    相关资源
    最近更新 更多