2016-10-02 20 views
1

是否允許增加已在end()的迭代器變量it,即auto it = v.end()它允許增加一個結束迭代器嗎?

  • 允許一般嗎?
  • 如果不是,是不是允許爲vector
  • 如果是,則爲++it也許冪等性如果it==v.end()

我問,因爲我偶然發現這樣的代碼:

std::vector<int> v{ 1, 2, 3, 4, 5, 6, 7 }; 
// delete every other element 
for(auto it=v.begin(); it<v.end(); ++it) { // it<end ok? ++it ok on end? 
    it = v.erase(it); 
} 

它工作正常使用g ++ - 6,但就是沒有證據。

對於一個it<v.end()可能只能與vectors,我想它應該讀it!=v.end()一般。但是在這個例子中,如果++it已經結束,那麼它將不會識別v的結尾。

+0

使用'!='將達到與<<相同的效果,減去整個小於零部件... – user2296177

+0

無論如何,您的代碼在邏輯上被打破。這就是爲什麼這樣的代碼通常會將'++ it'移到body中的else ++ it(假設首先有一個條件的'.erase';否則,循環是什麼?) –

+0

@LightnessRacesinOrbit oh ,你是說因爲我只刪除每一個第二個元素?不,那是設計。但你是對的,我應該提到這一點。就像現在這樣,它看起來很壞,我同意。我將添加代碼評論。 – towi

回答

4

否行爲未定義。您可以將迭代器設置爲結束(),但您不得增加或取消引用它。

只要支持容器不是空的,您可以減少它。

+0

從工作草案看來,只要你不取消引用,你似乎可以遞增迭代器多少次。它對於輸入和輸出迭代器都是有效的,因此它們都是來自它們的_derives_(作爲示例向前迭代器)。我寧願說增加迭代器不是UB,除非你決定取消引用這些迭代器。 – skypjack

+0

矢量的迭代器必須滿足前向迭代器的要求。前向迭代器必須滿足輸入迭代器的要求。輸入迭代器可以遞增,並且必須確保'i ++'返回一個可以解引用或者已經結束的迭代器。因此'i ++'似乎不是UB。請注意,遞增指針也不是UB,當您解除引用時會出現問題。 – skypjack

+2

「請注意,增加指針也不是UB」。這是不正確的。只允許在指針運算有效的情況下增加指針(例如數組,一個通過數組,一個通過標量)。 – Bathsheba