代码之家  ›  专栏  ›  技术社区  ›  Mike Lewis

STL映射迭代器是否可以通过递增而越界?

  •  7
  • Mike Lewis  · 技术社区  · 15 年前

    对于关联容器,++运算符是否可以发送一个迭代器超过集合的结尾?

    例子:

    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公司代码。

    3 回复  |  直到 15 年前
        1
  •  27
  •   Community T.Woody    7 年前

    如果递增结束迭代器,则结果是未定义的行为。所以,它可以保持结束,或者结束,或者给你祖母发一封邮件,链接到山羊。

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

        2
  •  11
  •   anon    15 年前

    前向迭代器的++运算符的前提条件是迭代器不可引用。这意味着它不能超过映射的末尾,所以代码给出了未定义的行为。这在C++标准的第24.1.3节中进行了描述。

        3
  •  5
  •   Alan    15 年前

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