在 C++03 中std::set::erase()
,采用单个迭代器的 的行为在表 69 中定义,其中具有以下假设(添加了突出显示):
在表 69 中,X 是关联容器类,a 是 X 的值,a_uniq 是 X 支持唯一键时的值,a_eq 是 X 的值,当 X 支持多个键时,i 和 j 满足输入迭代器要求并引用 value_type 的元素,[i, j) 是有效范围,p 是 a 的有效迭代器,q 是 a 的有效可解引用迭代器,[q1,q2) 是 a 中的有效范围,t 是值X::value_type 的值,k 是 X::key_type 的值,c 是 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
---------------------------