首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在迭代过程中对set调用erase()

()会导致迭代器失效。当我们对一个set进行迭代时,迭代器会指向当前元素。如果在迭代过程中调用erase()来删除元素,会导致当前元素被删除,迭代器失效。这是因为erase()会改变set的大小,导致后续元素的位置发生变化,迭代器无法正确指向下一个元素。

为了避免迭代器失效,可以采用以下两种方法之一:

  1. 使用迭代器的返回值作为参数传递给erase()函数。erase()函数返回一个指向被删除元素之后元素的迭代器,我们可以将该迭代器赋值给当前迭代器,以保持迭代的正确性。例如:for (auto it = mySet.begin(); it != mySet.end(); ) { if (condition) { it = mySet.erase(it); } else { ++it; } }这样,在删除元素后,迭代器会指向正确的下一个元素。
  2. 使用一个临时的容器来保存需要删除的元素的迭代器,然后再遍历临时容器进行删除。例如:std::set<int> toBeDeleted; for (auto it = mySet.begin(); it != mySet.end(); ++it) { if (condition) { toBeDeleted.insert(it); } } for (auto it : toBeDeleted) { mySet.erase(it); }这样,我们先将需要删除的元素的迭代器保存到临时容器中,然后再遍历临时容器进行删除,避免了在迭代过程中直接调用erase()导致迭代器失效的问题。

对于set的erase()操作,腾讯云提供了云原生数据库 TDSQL-C,它是一种高可用、高性能、分布式的云原生数据库产品,适用于大规模数据存储和访问的场景。TDSQL-C支持基于MySQL协议的接口,提供了强大的数据管理和查询功能,可以满足各种业务需求。您可以通过腾讯云官网了解更多关于TDSQL-C的信息:TDSQL-C产品介绍

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

set中插入元素x,实际插入的是构成的 键值

函数声明功能介绍pair insert ( const value_type& x )set中插入元素x,实际插入的是构成的 键值,如果插入成功,返回,如果插入失败,说明xset中已经 存在,返回void erase ( iterator position )删除set中position...位置上的元素size_type erase ( const key_type& x )删除set中值为x的元素,返回删除的元素的个数void erase ( iterator first, iterator...map中通过键值访问单个元素的速度通常比unordered_map容器慢,但map允许根据顺序元素进行直接迭代(即对map中的元素进行迭代时,可以得到一个有序的序列)。...#include void TestSet(){  int array[] = { 2, 1, 3, 9, 6, 0, 5, 8, 4, 7 }; // 注意:multiset底层实际存储的是

5710
  • Django | 如何优雅的某接口其他接口的调用

    开发中遇到的某个实际场景, django 中新增加一个 API 接口, 该接口部分的功能需要用到另一个接口的返回数据。...一个不那么优雅的解决方案是:新接口中以 HTTP 请求的方式调用另一个接口,在理论上该方案是可行。 但是也会带来一系列的问题,比如性能并发等问题。...毕竟 HTTP 通信建立连接等都有一定的耗时 更好的方案是通过函数调用的方式,新接口中调用前接口的视图函数!...我们都知道,Django 的请求数据都包装在 HttpRequest 对象中,既然我们要调用另一个接口的视图函数 那么就需要对 HttpRequest 对象进行封装,所以有必要了解一下 HttpRequest..."utf-8") >>> data b'"{\\"name\\": \\"jerry\\", \\"code\\": \\"Python\\"}"' >>> request.body = data 输完最后一行赋值代码后

    3.4K20

    【deque容器系列二】基于STL源码分析deque容器增删查实现及时间复杂度

    0. deque容器迭代器说明 正式开始讲述插入、删除等操作的实现前,我们先看下deque的特殊迭代器。..._M_set_node(__new_nstart + __old_num_nodes - 1); } 这个函数分为两个分支,很显然我们此时会走到else分支里面,它会先算出新的节点数量,这个数量一般是原来的基础上乘以...尾端插入调用push_back函数,操作与push_front函数基本类似,这里不再多说,同时我们从代码可以看出,整个头部插入过程中没有涉及到数据的拷贝,所以说deque容器头部和尾部插入都十分迅速,时间复杂度基本上是...2.2 从中间删除会发生什么 从中间删除会调用erase函数,deque容器有诸多erase函数的重载,我们选取其中一个进行解析,如下: iterator #if __cplusplus >= 201103L...(begin()); } _M_erase_at_end函数是从入参指定位置到容器结束位置全部删掉,在这个过程中所有buffer也会被清掉。

    1.1K50

    【C++】STL 容器 - set 集合容器 ③ ( set 集合容器常用 api 简介 | 删除元素 | 删除指定值的元素 | 删除指定迭代器位置元素 | 删除指定迭代器范围元素 )

    文章目录 一、删除元素 1、删除指定值的元素 - erase 函数 2、删除指定迭代器位置的元素 - erase 函数 3、删除指定迭代器范围的元素 - erase 函数 4、删除集合中的所有元素 -...clear 函数 一、删除元素 1、删除指定值的元素 - erase 函数 C++ 语言的 STL 标准模板库 中 , set 集合容器 是一个有序的集合 , 存储的元素值都是唯一的 , 不重复的...; 调用 set 集合容器的 erase 函数 , 可以删除 集合容器 中指定值 的元素 ; 上述 set#erase 函数原型如下 : size_type erase (const key_type&...5 , 9 两个元素 ; 5 9 Press any key to continue . . . 2、删除指定迭代器位置的元素 - erase 函数 set#erase 函数 还可以传入一个 指向指定元素位置的...- erase 函数 调用 set#erase 函数 , 可以传入两个迭代器参数 , 这两个迭代器划定了本集合容器的一个范围 , 执行该函数可删除该范围的所有元素 ; 函数原型如下 : iterator

    64310

    【C++】STL的基本用法

    仿函数(Function Objects):仿函数是可调用对象,它们STL中用于执行特定操作,如排序或变换。STL提供了一些内置的仿函数,同时也允许开发人员定义自己的仿函数,以满足特定需求。...STL容器之map ✨3.1 map C++的STL(标准模板库)中,map 是一种关联式容器,用于存储键-值。它按照键的顺序进行排序,并且具有快速查找功能。...这个简化的 MyMap 类模拟了 map 的一些基本功能,包括插入和查找键值实际的 map 实现中,还包括了红黑树平衡操作等,以确保高效的键值查找和维护有序性。...唯一性: set中不允许重复的元素,每个元素集合中只能出现一次。 动态操作: set支持插入和删除操作,可以在运行时动态地改变集合的大小。...⭐2.7 查找find() 返回值: 如果找到元素,返回指向该元素的迭代器。 如果未找到元素,返回容器的 end 迭代器。 注意:如果找到的元素最后一个,返回的则不是end迭代器!

    15110

    【C++深度探索】map与set的基础介绍与实用指南

    1.1 set的模板参数说明 T: set中存放元素的类型,实际底层存储的键值。... insert ( const value_type& x ) set中插入元素x,实际插入的是构成的键值,如果插入成功,返回,如果插入失败,说明xset中已经存在,返回 void erase ( iterator position ) 删除set中position位置上的元素 size_type...然后调用insert()函数将该键值插入到map中; 如果key已经存在,插入失败,insert函数返回该key所在位置的迭代器; 如果key不存在,插入成功,insert函数返回新插入元素所在位置的迭代器...也就是说调用operator[]时先构造一个键值调用insert插入带map中,看key是否存在,然后将对应的value返回。

    12610

    C++STL容器知识点小结

    > ---- 容器 实际的开发过程中,数据结构本身的重要性完全不逊于算法的重要性,当程序中存在着对时间要求很高的部分时...<<ret.second<<endl; first返回插入元素的迭代器,*它得到的就是这个数值 set迭代set.insert(elem); //容器中插入元素。...set.clear(); //清除所有元素 set.erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。...set.erase(beg,end); //删除区间[beg,end)的所有元素,返回下一个元素的迭代器。 set.erase(elem); //删除容器中值为elem的元素。...map.erase(key); //删除容器中key为key的组,返回删除的组个数,失败返回0 map.erase(key_type *first, key_type *last) //删除数组指定的半闭半开的区间中

    69010

    C++STL容器总结

    序列式容器才可以容器初始化的时候制定大小,关联式容器不行; 3.注意,关联容器的迭代器不支持it+n操作,仅支持it++操作。...bool标志着插入是否成功,而iterator代表插入的位置,若该键值已经set中,则iterator表示已存在的该键值set中的位置。...:make_pair()函数内调用的仍然是pair构造函数 set中的erase()操作是不进行任何的错误检查的,比如定位器的是否合法等等,所以用的时候自己一定要注意。...(pos); m.erase(begin,end); m.erase(key); 使用 begin()和end()遍历map 使用数组的方法遍历map 使用find()查找 用find函数来定位数据出现位置它返回的一个迭代器...map题目中的应用 去重:利用映射的一一应性,把可能出现重复的数据设置为key值以达到去重的目的。

    75310

    C++ STL map迭代器失效问题

    最近在开发过程中,定位一个问题的时候,发现多线程场景下大量创建和销毁某个C:\Windows\System32\reg.exe时出现了383个进程创建消息处理的接口,和384个进程销毁处理消息的接口都在等待锁...最后想了一下,是不是某个地方线程做了耗时或者同步阻塞操作导致的,或者线程中执行了死循环,排查后发现是因为一个同事在对map做循环遍历时,erase操作不当,导致某个地方迭代器失效,线程崩溃了,持有两把锁...为了上述模拟多线程访问死锁的问题,我简单写了个demo示例,main函数中创建了两个线程,其中一个线程std::map g_cityMap数据做删除操作,另外一个线程...从上面的错误可以看出:程序报cannot increment value-initialized map/set iterator异常。...erase迭代器只是被删元素的迭代器失效,但是返回值为void, 所以要采用erase(iter++)的方式删除迭代器。

    58410

    【C++高阶】探索STL的瑰宝 map与set:高效数据结构的奥秘与技巧

    unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代 set底层是用二叉搜索树(红黑树)实现的 特征: 与map/multimap不同,map/multimap中存储的是真正的键值...>,如果插入失败,说明xset中已经存在,返回 void erase ( iterator position ) 删除set中position位置上的元素 size_type...返回set中值为x的元素的个数 set的这些函数中,用的最多的就是insert,find,erase 首先insert一般是直接插入元素,或者是一段迭代器区间,直接插入一个元素时,它的返回值是...不用多说,set中是找到则返回该位置迭代multiset中是返回第一个该元素位置的迭代eraseset中主要的作用就是删除该迭代器位置的元素,或者删除迭代器区间 第二种用法是针对multiset...它们不仅提供了高效的数据存储和检索机制,还通过其独特的性质解决了许多实际问题 在学习的过程中,我们领略了map如何以键值的形式存储数据,并通过键来快速检索值。

    38110

    C++(STL):27 ---关联式容器set源码剖析

    一、set set语法使用参阅: set的特性 set所有元素都会根据元素的键值自动被排序 set中的键值就是实值,实值就是键值 默认情况下set不允许两个元素重复 set迭代器 不能根据set迭代器改变...因为其键值就是实值,实值就是键值,如果改变set元素值,会严重破坏set组织 在后面的源码中会看到,set迭代set::iterator被定义为底层RB-tree的const_iterator...因此set迭代器是一种constant iterators set拥有与list的相同的某些性质 当客户端它进行元素新增(insert)操作或删除(erase)操作时,操作之前的所有迭代操作完成之后依然有效...是以RB-tree为底层机制 又由于set所开放的各种操作接口,RB-tree也都提供了,所以几乎所有的set操作行为,都只是转调用RB-tree的操作行为而已 set源码 下面是set的源代码摘录..._M_t; return *this; } //以下所有的set操作,RB-tree都已提供,所以set只要传递调用即可 // accessors: key_compare key_comp()

    69620

    C++ set用法大全

    其实很简单,我们说过set的内部使用了红黑树所有的元素进行了排序。树结构当中,我们通常使用的都是的形式。其中的key用来排序,value则是我们实际存储的值。...insert insert函数非常简单,就直接调用,往set里插入即可。...P p{0, 3}; st.insert(p); 如果使用emplace函数呢,则是这样: st.emplace(1, 23); 因为emplace的内部会替我们去调用结构体P的构造函数,使用1和23...erase 说完了插入再说说删除,set当中删除的方法只有一个就是erase,但是它却有好几种用法。...后面两种返回的都是一个迭代器,指向删除元素后面一个位置。 clear 清空set。 find set中的查询函数,传入我们要查询的value,返回一个迭代器。

    4.1K10

    STL容器的线程安全性了解多少?

    list和sllist,所有的标准关联容器 条款2:小心"容器无关代码"的幻想 STL是建立泛化基础上的:数组泛化为容器,参数化了所包含的对象的类型;函数泛化为了算法,参数化了所用的迭代器的类型;指针泛化为迭代器...//通过自由地容器和迭代器类型使用typedef //这样可以吗?...} //如果避免这种问题:必须保证调用 erase之前就得到了c中下一个元素得迭代器,因此 i 上使用后置递增 for(std::set::iterator i = caaaa.begin...,每当调用erase时记得都用它得返回值更新你得迭起器 * 3.2 如果是标准关联容器,写一个循环来遍历容器元素,当你把迭代器传给erase时记得后置递增 * */ 条款10:注意分配器得协定和约束 什么是...,于是你试图这样实现: * 1,每次调用容器的成员函数期间都要锁定该容器 * 2,每个容器返回的迭代器 begin或end的生存期之内都要锁定该容器 * 3,每个容器调用的算法执行期间锁定该容器

    1.4K10

    c++ 迭代器失效_c++迭代器是什么

    C++ 迭代器(Iterator) 1.1 定义 迭代器是一种检查容器内元素并遍历元素的数据类型。 迭代器是一个变量,提供一个容器中的对象的(间接)访问方法,并且定义了容器中对象的范围。...反向迭代器和正向迭代器的区别在于: 对正向迭代器进行++操作时,迭代器会指向容器中的后一个元素; begin() -> end() 从前往后遍历 反向迭代器进行++操作时,迭代器会指向容器中的前一个元素...同理,迭代器是一个对象,STL 重载迭代器的++运算符时,后置形式也比前置形式慢。在次数很多的循环中,++i 和 i++ 可能就会造成运行时间上可观的差别了。...distance(p, q):计算两个迭代器之间的距离,即迭代器 p 经过多少次 + + 操作后和迭代器 q 相等。如果调用时 p 已经指向 q 的后面,则这个函数会陷入死循环。...---- 节点式容器: 关联式容器(如map, set,multimap,multiset) (1)删除当前的iterator,仅仅会使当前的iterator失效,只要在erase 时,递增当前 iterator

    1.1K40

    【C++】map 和 set

    ;最重要的修改操作是 insert 和 erase; insert 支持插入一个值、某个迭代器位置插入值、插入一段迭代器区间,我们学会第一个即可,插入的过程就是二叉搜索树的插入过程;需要注意的是 insert...= s.end()) s.erase(pos); //输出key为9的节点的个数 cout << s.count(9) << endl; } 如果大家 set 的使用还有不清楚的地方,建议查阅...实际上 find 返回的是中序遍历过程中第一个匹配的节点位置的迭代器: multiset 使用范例 void multiset_test() { // 用数组array中的元素构造multiset...2、map 的使用 构造 迭代器 修改 修改中的重点的仍然是 insert 和 erase,swap 为交换两棵树的根,clear 为释放树中的每一个节点; 和 set 一样,map 的 insert...然后调用insert()函数将该键值插入到map中 // 如果key已经存在,插入失败,insert函数返回该key所在位置的迭代器 // 如果key不存在,插入成功,insert函数返回新插入元素所在位置的迭代

    59600
    领券