2009-08-24 84 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)。