我有以下代码:
set<Key> test;
test.insert(key1);
test.insert(key2);
iter1 = test.find(key1);
iter2 = test.find(key2);
test.erase(iter1);
我的问题是,如果 key1 被删除,现在我可以在测试中使用 iter2 来引用 key2 吗?
谢谢
是的,seterase
仅使指向已擦除元素的迭代器无效(请注意,这不一定适用于所有容器)。
严格来说,您必须检查“插入”操作的返回值,并确保key1
与key2
不比较相等;否则iter1 == iter2
,擦除iter1
无效iter2
。但总的来说,请参阅前面的答案,擦除迭代器只会使该迭代器无效,而不会使其他迭代器失效。
例子:
struct Foo
{
Foo(std::string s = "") : s(s) { }
bool operator<(const Foo & other) { return s.size() < other.size(); }
}
std::set<Foo> x;
x.insert(Foo("Cat"));
x.insert(Foo("Dog")); // booboo
关联容器 set、multiset、map 和 multimap 只需要使迭代器和对已擦除元素的引用无效。
在双端队列中,所有迭代器和引用都无效,除非擦除的成员位于双端队列 (23.2.1.3/4) 的末尾(前或后),在列表中只有迭代器和对已擦除元素的引用无效( 23.2.2.3/3) 并且在一个向量上,擦除点之后的每个迭代器和引用都无效 (23.2.4.3/3)