C++ 在C++;更改其他元素的地址?

C++ 在C++;更改其他元素的地址?,c++,set,erase,C++,Set,Erase,我有以下代码: set<Key> test; test.insert(key1); test.insert(key2); iter1 = test.find(key1); iter2 = test.find(key2); test.erase(iter1); set测试; 测试。插入(键1); 测试。插入(键2); iter1=测试。查找(键1); iter2=测试。查找(键2); 测试。擦除(iter1); 我的问题是,如果删除了键1,现在我可以使用iter2引用测试中的键2吗

我有以下代码:

set<Key> test;
test.insert(key1);
test.insert(key2);
iter1 = test.find(key1);
iter2 = test.find(key2);
test.erase(iter1);
set测试;
测试。插入(键1);
测试。插入(键2);
iter1=测试。查找(键1);
iter2=测试。查找(键2);
测试。擦除(iter1);
我的问题是,如果删除了键1,现在我可以使用iter2引用测试中的键2吗


感谢

是,set的
擦除
只会使指向被擦除元素的迭代器失效(注意,这并不一定适用于所有容器)。

严格来说,您必须检查“insert”操作的返回值,并确保
键1
键2
的比较不相等;否则,
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
structfoo
{
Foo(std::string s=”“):s(s){

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

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

谢谢您这么快回复~如果在擦除键1之后,我在测试中插入另一个键3怎么办?我仍然可以使用iter2引用键2吗?@user508305:是的,insert也不会使迭代器无效。您是否有关联容器规则的标准参考?是的,那将是
23.1.2/8
[lib.associative.reqmts]
插入成员不得影响迭代器和对容器的引用的有效性,擦除成员应仅使迭代器和对已擦除元素的引用无效。