2009-08-24 86 views
7

对于关联容器,++运算符可以发送迭代器超过集合的末尾吗?STL映射迭代器可以通过递增出界吗?

实施例:

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

+1

那么你编译它,并检查它是否将在最后new_map.end()?如果您不确定,可能是最简单的方法来回答这个问题。 – Goz 2009-08-24 21:09:36

+9

@Goz:不,这只会回答一个实施正在做什么。 – sbi 2009-08-24 21:11:59

+3

可能的重复[如果增加迭代器等于STL容器的结束迭代器会发生什么情况](https://stackoverflow.com/questions/1057724/what-happens-if-you-increment-an-iterator这就是等于最终迭代器的一个) – Raedwald 2017-11-29 10:56:24

回答

11

上的前向迭代++运算符的前提是迭代器提领。这意味着它不能超过地图的末尾,所以你的代码给出了未定义的行为。这在C++标准的第24.1.3节中有描述。

+0

24.2.3其实为输入迭代器,24.2.4为输出。 – Ruslan 2016-04-22 17:00:11

5

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