• c++17关联式容器的extract


    今天偶然在某乎看见一个评论,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值的方法其实也没那么玄乎,就是偷偷做了些手脚罢。如有差错请指正!

  • 相关阅读:
    Scrapy settings 并发数更改
    tp5 规避 [ error ] 未定义数组索引
    967. Numbers With Same Consecutive Differences
    846. Hand of Straights
    1103. Distribute Candies to People
    559. Maximum Depth of N-ary Tree
    1038. Binary Search Tree to Greater Sum Tree
    538. Convert BST to Greater Tree
    541. Reverse String II
    1551. Minimum Operations to Make Array Equal
  • 原文地址:https://www.cnblogs.com/Cxiangyang/p/14069845.html
Copyright © 2020-2023  润新知