我有以下代码:
set<Key> test;
test.insert(key1);
test.insert(key2);
iter1 = test.find(key1);
iter2 = test.find(key2);
test.erase(iter1);
我的问题是,如果删除key1,我现在可以使用iter2在测试中引用key2吗?
由于
答案 0 :(得分:7)
是的,set的erase
仅使指向被删除元素的迭代器无效(请注意,并非所有容器都是如此)。
答案 1 :(得分:3)
严格来说,您必须检查“插入”操作的返回值,并确保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
答案 2 :(得分:3)
需要使用asociative容器集,multiset,map和multimap来使迭代器和对已擦除元素的引用无效。
在双端队列中,所有迭代器和引用都是无效的,除非擦除的成员位于双端队列的末端(前面或后面)(23.2.1.3/4), 在列表中,只有迭代器和对擦除元素的引用无效(23.2.2.3/3),并且在一个向量上,擦除点之后的每个迭代器和引用都无效(23.2.4.3/3)