• C++ STL 容器重要概念


    本文所有内容均在 GNU C++ (64位) 里瞎搞出来,有很多猜测,仅供参考

    如何定义

    vector/deque/list/forward_list <T, allocator<T> >
    set <T, less<T>, allocator<T> >
    map <T, U, less<T>, allocator< pair<T, U> > >
    unordered_set < T, hash<T>, equal_to<T>, allocator<T> >
    unordered_map < T, U, hash<T>, equal_to<T>, allocator< pair<T, U> > >
    basic_string/basic_stringstream <T, char_traits<T>, allocator<T> >
    queue/stack <T, deque<T> >
    priority_queue <T, vector<T>, less<T> >
    array <T, N>
    bitset <N>
    

    内存分配

    容器 sizeof 扩容方式 内存释放方式
    vector 24 每次两倍 不释放
    deque 80 初始512字节,每次512字节+少量额外内存 基本释放
    list 16 要多少申请多少 不留多余内存
    forward_list 8 要多少申请多少 不留多余内存
    (multi)set/map 48 要多少申请多少 不留多余内存
    unordered_(multi)set/map 56 要多少申请多少+桶的内存 桶不释放,其余不留多余内存
    string 8 每次两倍+少量额外内存 不释放
    stringstream 368 初始512字节,每次两倍+少量额外内存 不释放
    • queue,stack,priority_queue是由其他容器改造过来的(第二个模板参数),queue,stack默认是deque,priority_queue默认是vector
    • array,bitset都是固定长度,没有内存分配器,估计和数组行为一致
    • list,forward_list,set,map这些链表数据结构(unordered每个桶也是链表),每个结点的指针的内存不通过自定义内存分配器分配。目前初步估计set/map的每个结点有额外24字节(通过鸡兔同笼法),其余懒得算

    时间复杂度

    • listsize()(O(n)) 的!(forward_list 干脆不定义这个函数),想用 list 代替 deque 的同学要注意这个坑点
    • arrayswap()(O(n)) 的(要把它当c的数组看待)
    • 其他复杂度还没发现不正常的

    迭代器

    • 由其他容器改造的容器(queue,stack,priority_queue)都没有迭代器
    • bitset没有迭代器
    • stringstream没有迭代器(不考虑特殊迭代器)
  • 相关阅读:
    centos7 使用postgres
    centos7 Authentication failure
    centos 安装 jdk PostgreSQL
    JS遍历对象或者数组
    PHP简单 对象(object) 与 数组(array) 的转换
    IDEA 配置Tomcat 跑Jeecg项目
    kettle 安装mysql 驱动
    : Could not open a connection to your authentication agent
    java_Ninja实战过程
    设备判断
  • 原文地址:https://www.cnblogs.com/axiomofchoice/p/13659385.html
Copyright © 2020-2023  润新知