c++17关联式容器的extract

今天偶然在某乎看见一个评论,c++17后关联式容器居然可以修改key;我们知道map和set这种内部由红黑树构成的容器,它必须用键的值去以特定的排列方式去维持其平衡二叉搜索树的特性,所以插入删除节点会进行左旋右旋这种骚操作。

查一下百度翻译:extract由提取的意思

c++17关联式容器的extract

然后顺道看了几篇文章

cpp参考手册(不二人选)

https://en.cppreference.com/w/cpp/container/map/extract

某大佬的文章

https://www.cnblogs.com/yunlambert/p/13620363.html

 

c++17关联式容器的extract

 

 

看了一下箭头所示的使用方法,先去extract一下,然后又将其返回值重新插入,由此我猜测extract的内部实现可能就是先删除了该节点,返回值返回其拷贝,最终修改后又重新插入进去

 

 

 

 为了验证这个想法下了最新版本gcc10.2,查看map中的extract方法,我们知道它肯定是调用的红黑树里的实现,所以就直接看红黑树源码

c++17关联式容器的extract

 

 和cpp参考手册写的一样,他有两个版本,一个是通过key为参数,一个是迭代器为参数,这里可以看出key为参数就是先找出key这个节点,然后调用迭代器为参数的版本,到这里就差不多验证了猜想(ps:源码有兴趣的同学可以继续深究,我也没去仔细看,私以为不需要看,会花费大量时间)

结论:c++17的改key值的方法其实也没那么玄乎,就是偷偷做了些手脚罢。如有差错请指正!

原文链接: https://www.cnblogs.com/Cxiangyang/p/14069845.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    c++17关联式容器的extract

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/205618

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午10:17
下一篇 2023年2月12日 下午10:17

相关推荐