C ++中set的擦除功能会改变其他元素的地址吗?

时间:2011-06-19 14:23:28

标签: c++ set erase

我有以下代码:

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

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

由于

3 个答案:

答案 0 :(得分:7)

是的,set的erase仅使指向被删除元素的迭代器无效(请注意,并非所有容器都是如此)。

答案 1 :(得分: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

答案 2 :(得分:3)

需要使用asociative容器集,multiset,map和multimap来使迭代器和对已擦除元素的引用无效。

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