5

我有以下代码:

set<Key> test;
test.insert(key1);
test.insert(key2);
iter1 = test.find(key1);
iter2 = test.find(key2);
test.erase(iter1);

我的问题是,如果 key1 被删除,现在我可以在测试中使用 iter2 来引用 key2 吗?

谢谢

4

3 回答 3

7

是的,seterase仅使指向已擦除元素的迭代器无效(请注意,这不一定适用于所有容器)。

于 2011-06-19T14:25:08.283 回答
3

严格来说,您必须检查“插入”操作的返回值,并确保key1key2不比较相等;否则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
于 2011-06-19T14:37:54.240 回答
3

关联容器 set、multiset、map 和 multimap 只需要使迭代器和对已擦除元素的引用无效。

在双端队列中,所有迭代器和引用都无效,除非擦除的成员位于双端队列 (23.2.1.3/4) 的末尾(前或后),在列表中只有迭代器和对已擦除元素的引用无效( 23.2.2.3/3) 并且在一个向量上,擦除点之后的每个迭代器和引用都无效 (23.2.4.3/3)

于 2011-06-19T14:43:52.140 回答