zoukankan      html  css  js  c++  java
  • 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值的方法其实也没那么玄乎,就是偷偷做了些手脚罢。如有差错请指正!

  • 相关阅读:
    UVA 10618 Tango Tango Insurrection
    UVA 10118 Free Candies
    HDU 1024 Max Sum Plus Plus
    POJ 1984 Navigation Nightmare
    CODEVS 3546 矩阵链乘法
    UVA 1625 Color Length
    UVA 1347 Tour
    UVA 437 The Tower of Babylon
    UVA 1622 Robot
    UVA127-"Accordian" Patience(模拟)
  • 原文地址:https://www.cnblogs.com/Cxiangyang/p/14069845.html
Copyright © 2011-2022 走看看