C++ 在c+中删除和插入元素时,是否有方法在multiset或unordered_集中的元素上循环+;

C++ 在c+中删除和插入元素时,是否有方法在multiset或unordered_集中的元素上循环+;,c++,unordered-set,multiset,C++,Unordered Set,Multiset,我想在multiset或unordered_集中的每个元素上循环,在循环过程中,我可以插入和删除元素。 例如: unordere_set<int> myset = { 1, 2, 3, 4 }; for (auto it = myset.begin(); it != myset.end(); ++it) { myset.erase(*it); // do something that needs to use the set without *it like in a

我想在multiset或unordered_集中的每个元素上循环,在循环过程中,我可以插入和删除元素。 例如:

unordere_set<int> myset = { 1, 2, 3, 4 };
for (auto it = myset.begin(); it != myset.end(); ++it) {
    myset.erase(*it);
    // do something that needs to use the set without *it like in a recursion function that takes the reference of the set
    myset.insert(*it);      
}
无序集myset={1,2,3,4}; for(auto-it=myset.begin();it!=myset.end();+it){ myset.erase(*它); //做一些需要使用集合而不使用它的事情,就像在引用集合的递归函数中一样 myset.插入(*it); }
我不想创建集合的副本,因为集合可能非常大,而且效率也不高。

我认为这段代码没有问题(尽管未经测试)

unordered_set myset={1,2,3,4};
for(auto it=myset.begin();it!=myset.end();){
自动保存=*它;
it=myset.erase(它);
//做一些需要使用集合而不使用它的事情,就像在引用集合的递归函数中一样
myset.insert(保存);
}

我的理由是,
mysave.insert(save)
不应使迭代器
无效,因为它不会导致无序集的重新灰化,因为您所做的只是添加回以前删除的元素。但是当然,这完全取决于您使用
//做些什么…

在遍历时尽量避免插入和删除。这是一个糟糕的建议

#include <vector>
#include <unordered_set>
using namespace std;

int main() {
  unordered_set<int> s { 1, 2, 3, 4, 5, 6, 7 };
  vector<unordered_set<int>::const_iterator> s_add;
  vector<unordered_set<int>::const_iterator> s_del;
  for (auto itr = s.begin(); itr != s.end(); ++itr) {
    // Some conditions
    s_add.push_back(itr);
    // Some conditions
    s_del.push_back(itr);
  }

  for (auto itr : s_add) {
    s.insert(*itr);
  }

  for (auto itr : s_del) {
    s.erase(itr);
  }

  return 0;
}
#包括
#包括
使用名称空间std;
int main(){
无序_集s{1,2,3,4,5,6,7};
向量s_加法;
向量s_del;
对于(自动itr=s.begin();itr!=s.end();++itr){
//一些条件
s_添加。推回(itr);
//一些条件
s_del.push_back(itr);
}
用于(自动itr:s_添加){
s、 插入(*itr);
}
用于(自动itr:s_del){
s、 擦除(itr);
}
返回0;
}
根据,插入可能会影响
无序集
容器上的所有迭代器

如果由于插入而发生重新灰化,则所有迭代器都将被删除 无效。否则迭代器不受影响。参考文献不是 无效。仅当新的元素数为 大于
最大装载系数()*铲斗计数()

如果插入是 成功,在创建元素时获取元素的指针和引用 保存在节点句柄中的将无效,指针和 在提取该元素之前获得的对该元素的引用成为 有效

我想知道,如果您只是想迭代一个容器并对其执行一些插入/删除操作,为什么不使用
std::vector
容器和元素索引来插入/删除它们呢

如果坚持使用
unordered_集
,则可以在
while
循环中使用
std::next
来迭代
unordered_集
容器,并对其执行一些插入/删除操作

请注意,由于将在循环的末尾插入相同的元素,因此不会触发重新灰化算法

unordered_set myset={1,2,3,4};
无序_集::迭代器it=myset.begin();
int i=0;
while(it!=myset.end()){
myset.erase(*它);
//做一些需要使用集合而不使用它的事情,就像在引用集合的递归函数中一样
myset.插入(*it);
it=next(myset.begin(),++i);
}

当您说使用不带*的集合时,您是指以下代码不会使用
it
还是希望在没有特定成员的情况下对
集合
进行操作(例如,在第一次迭代时,对不带元素的集合执行操作
1
)?你可能只想让你的函数引用集合,引用你不想操作的迭代器,也就是说我希望在集合上操作而不使用特定的成员。也许使用?
#include <vector>
#include <unordered_set>
using namespace std;

int main() {
  unordered_set<int> s { 1, 2, 3, 4, 5, 6, 7 };
  vector<unordered_set<int>::const_iterator> s_add;
  vector<unordered_set<int>::const_iterator> s_del;
  for (auto itr = s.begin(); itr != s.end(); ++itr) {
    // Some conditions
    s_add.push_back(itr);
    // Some conditions
    s_del.push_back(itr);
  }

  for (auto itr : s_add) {
    s.insert(*itr);
  }

  for (auto itr : s_del) {
    s.erase(itr);
  }

  return 0;
}