C++ 在c+中删除和插入元素时,是否有方法在multiset或unordered_集中的元素上循环+;
我想在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
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;
}