在C++ 03,的採用單個迭代器std::set::erase()
的行爲在表69中定義,whihc具有以下假設(高亮加入):
在表69中,X是關聯容器類,a是X的值,a_uniq是X支持唯一鍵時X的值,而a當X支持多個鍵時,a和e是X的值,i和j滿足輸入迭代器要求並引用value_type的元素, [I,J)是一個有效的範圍,p是一個有效的迭代到,q是一個有效的提領迭代到,[Q1,Q2)處於有效範圍,t爲X的值:: VALUE_TYPE ,k是X :: key_type的值,c是typ的值e X :: key_compare。
表69說,這個關於erase()
功能:
a.erase(q)
- 擦除指向的元素q
換句話說,迭代器必須提領。如果它不是未定義的行爲,因爲前提條件不被保留。
對圖書館的行爲並沒有任何特別的承諾。某些庫(如MSVC)可以在某些配置中包含迭代器調試。例如,在VS 2012與調試配置中運行時,你會看到以下內容:
---------------------------
Microsoft Visual C++ Runtime Library
---------------------------
Debug Assertion Failed!
Program: C:\Windows\system32\MSVCP110D.dll
File: c:\program files (x86)\microsoft visual studio 11.0\vc\include\xtree
Line: 1326
Expression: map/set erase iterator outside range
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
---------------------------
Abort Retry Ignore
---------------------------
我相信這是不確定的,你不知道會發生什麼,它甚至可以在相同的運行做不同的事情該程序。 – 2013-03-11 19:56:30
爲什麼不讓你的代碼更簡單,只需使用:'s.erase(val);'(即使'val'不存在,它給出了定義的行爲)? – 2013-03-11 20:03:55
_「如果指定了無效的位置或範圍,則會導致未定義的行爲。」_ [最後一行](http://www.cplusplus.com/reference/set/set/erase/)。 – deepmax 2013-03-11 20:05:20