今天偶然在某乎看见一个评论,c++17后关联式容器居然可以修改key;我们知道map和set这种内部由红黑树构成的容器,它必须用键的值去以特定的排列方式去维持其平衡二叉搜索树的特性,所以插入删除节点会进行左旋右旋这种骚操作。
查一下百度翻译:extract由提取的意思
然后顺道看了几篇文章
cpp参考手册(不二人选)
https://en.cppreference.com/w/cpp/container/map/extract
某大佬的文章
https://www.cnblogs.com/yunlambert/p/13620363.html
看了一下箭头所示的使用方法,先去extract一下,然后又将其返回值重新插入,由此我猜测extract的内部实现可能就是先删除了该节点,返回值返回其拷贝,最终修改后又重新插入进去
为了验证这个想法下了最新版本gcc10.2,查看map中的extract方法,我们知道它肯定是调用的红黑树里的实现,所以就直接看红黑树源码
和cpp参考手册写的一样,他有两个版本,一个是通过key为参数,一个是迭代器为参数,这里可以看出key为参数就是先找出key这个节点,然后调用迭代器为参数的版本,到这里就差不多验证了猜想(ps:源码有兴趣的同学可以继续深究,我也没去仔细看,私以为不需要看,会花费大量时间)
结论:c++17的改key值的方法其实也没那么玄乎,就是偷偷做了些手脚罢。如有差错请指正!