2013-03-06 44 views
0

std :: unordered_set :: erase()有3個重載:在一個引用中,傳遞一個「無效」值,即一個不' t存在於該集合中,只是讓erase()返回0.但其他兩個重載又如何?無效迭代器的結果傳遞給std :: unordered_set :: erase()

C++ 11標準是否說在這種情況下erase()應該做什麼,或者它依賴於編譯器?它應該返回end()還是未定義的行爲?

我在說明書cppreference.com,cplusplus.com中找不到答案。在IBM網站上,他們說如果操作後沒有元素,它會返回end(),但如果操作本身由於無效的迭代器而失敗會發生什麼?

一般來說,在這種情況下,STL容器的erase()方法是否具有未定義的行爲? (所以我需要檢查我的迭代器之前,我通過任何擦除(),或使用unordered_set :: erase()重載它需要一個value_type引用,如果失敗,它將簡單地返回0)

+0

如果你正在處理一個無效的迭代器,你已經在其他地方發生了錯誤。標準庫不關心。爲什麼要這樣?它只允許你訪問有效的迭代器 - 你以後做的任何事情都是你的問題。 – Xeo 2013-03-06 13:24:12

回答

2

這是兩個完全不同的情況。沒有「無效值」,集合中不存在的值仍然有效。所以你傳遞一個不包含在該集合中的有效值,從而返回0 - 沒有元素被擦除。

其他重載是完全不同的。該標準要求傳遞給擦除方法的迭代器分別是「有效和無法引用」和「有效的迭代器範圍」。否則,行爲是不確定的。

所以是的,迭代器必須是有效的。但是你不能檢查一個迭代器是否以編程方式有效 - 你必須從你的程序邏輯確定它們是。

4

有一個嘗試刪除集合中不存在的值並嘗試從無效的迭代器中刪除之間存在很大的語義差異。

試圖使用無效的迭代器是未定義的行爲,並會嚴重結束。

你有沒有具體的用例,你想知道什麼時候你想擦除一個無效的迭代器?

+0

不,但我想知道會發生什麼。有沒有定義的行爲,例如「沒有任何變化」,例如「刪除使用無效的迭代器」或「刪除使用有效的迭代器指向另一個容器中的值」? – cfa45ca55111016ee9269f0a52e771 2013-03-06 13:27:39

+0

我想知道會發生什麼,以便我的代碼可以使用assert()來捕獲無效的檢測結果。 – cfa45ca55111016ee9269f0a52e771 2013-03-06 13:29:05

+2

不可以。像111111的答案所述,無效的迭代器傳遞給'erase'會導致未定義的行爲。 – us2012 2013-03-06 13:29:31