stl中的set::erase的内部使用的是什么方法

zhfkt 2013-04-27 09:45:33
现在打算在项目中使用set做一个容器,然后会频繁的使用set::erase的操作

我想询问的是set::erase中内部采用的是什么样的方法,是线性遍历删除还是有索引的进行删除。由于会频繁使用set::erase,当然希望set::erase是能够在索引的基础上进行删除的方法,否则整个程序运行起来就会很慢。如果set::erase不能够迅速的删除,那么还有什么容器以及对应的方法可以做到这一点?
...全文
314 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Star-light 2013-04-29
  • 打赏
  • 举报
回复
引用 9 楼 FancyMouse 的回复:
[quote=引用 8 楼 zdarkalone 的回复:] [quote=引用 6 楼 FancyMouse 的回复:] [quote=引用 5 楼 zdarkalone 的回复:] set的erase有两种,传入迭代器的O(1),传入key_value的O(logN) unordered_set都是O(1)
>传入迭代器的O(1) 那是均摊常数。最坏还是logn。[/quote] 最坏是O(n),全部hash到一个bin,相当于一个list 一般不用考虑这情况。。。[/quote] set用的是rbtree不是hashtable。你说的是hashtable我说的是rbtree。[/quote] 看错抱歉
FancyMouse 2013-04-29
  • 打赏
  • 举报
回复
引用 8 楼 zdarkalone 的回复:
[quote=引用 6 楼 FancyMouse 的回复:] [quote=引用 5 楼 zdarkalone 的回复:] set的erase有两种,传入迭代器的O(1),传入key_value的O(logN) unordered_set都是O(1)
>传入迭代器的O(1) 那是均摊常数。最坏还是logn。[/quote] 最坏是O(n),全部hash到一个bin,相当于一个list 一般不用考虑这情况。。。[/quote] set用的是rbtree不是hashtable。你说的是hashtable我说的是rbtree。
Star-light 2013-04-29
  • 打赏
  • 举报
回复
引用 6 楼 FancyMouse 的回复:
[quote=引用 5 楼 zdarkalone 的回复:] set的erase有两种,传入迭代器的O(1),传入key_value的O(logN) unordered_set都是O(1)
>传入迭代器的O(1) 那是均摊常数。最坏还是logn。[/quote] 最坏是O(n),全部hash到一个bin,相当于一个list 一般不用考虑这情况。。。
赵4老师 2013-04-28
  • 打赏
  • 举报
回复
对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
FancyMouse 2013-04-28
  • 打赏
  • 举报
回复
引用 5 楼 zdarkalone 的回复:
set的erase有两种,传入迭代器的O(1),传入key_value的O(logN) unordered_set都是O(1)
>传入迭代器的O(1) 那是均摊常数。最坏还是logn。
Star-light 2013-04-28
  • 打赏
  • 举报
回复
set的erase有两种,传入迭代器的O(1),传入key_value的O(logN) unordered_set都是O(1)
rocktyt 2013-04-28
  • 打赏
  • 举报
回复
引用 2 楼 zhfkt 的回复:
[quote=引用 1 楼 qq120848369 的回复:] set是红黑树,删除结点是常数操作。 你需要知道用哈希还是用红黑树,后者比前者多了一个遍历有序的功能,相应就会有性能的损耗,尤其表现在查找元素,这种代价在你不知道某个节点的索引而希望删除它的时候就不可忽略了。 建议:使用哈希表,并根据数据规模预开辟足够的哈希桶,减少冲突。
常数操作是O(N)么??[/quote]是O(1) 如果你是用迭代器删除,那效率是比较高的,并且与容器大小无关,虽然效率应该比不过hash表 如果是根据值来删除,那复杂度是O(logN),hash表仍然是O(1)
zhfkt 2013-04-27
  • 打赏
  • 举报
回复
引用 1 楼 qq120848369 的回复:
set是红黑树,删除结点是常数操作。 你需要知道用哈希还是用红黑树,后者比前者多了一个遍历有序的功能,相应就会有性能的损耗,尤其表现在查找元素,这种代价在你不知道某个节点的索引而希望删除它的时候就不可忽略了。 建议:使用哈希表,并根据数据规模预开辟足够的哈希桶,减少冲突。
常数操作是O(N)么??
qq120848369 2013-04-27
  • 打赏
  • 举报
回复
set是红黑树,删除结点是常数操作。 你需要知道用哈希还是用红黑树,后者比前者多了一个遍历有序的功能,相应就会有性能的损耗,尤其表现在查找元素,这种代价在你不知道某个节点的索引而希望删除它的时候就不可忽略了。 建议:使用哈希表,并根据数据规模预开辟足够的哈希桶,减少冲突。

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧