• C++ STL容器总结


    1.    STL 容器

             

     

    1.    按种类划分

    • 顺序容器( sequence containers):是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。顺序性容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定。顺序容器包括:vector(向量)、list(双向列表)forward_list(单向链表)、deque(队列)。

     

    • 关联容器(associative containers):关联式容器是非线性的树结构,更准确的说是红黑树结构。各元素之间没有严格的物理上的顺序关系,也就是说元素在容器中并没有保存元素置入容器时的逻辑顺序。但是关联式容器提供了另一种根据元素特点排序的功能,这样迭代器就能根据元素的特点“顺序地”获取元素。元素是有序的集合,默认在插入的时候按升序排列。关联容器包括:map(集合)、set(映射)、multimap(多重集合)、multiset(多重映射)。

     

    • 无序容器(unordered containers):unordered_set、unodered_multiset、unordered_map、unodered_multimap都是无序容器,都是以哈希表实现的 ,

     

    2.    各容器的特点对比

     

     PK

    vector

    deque

    list

    set

    multiset

    map

    multimap

    名称

    向量容器

    双向队列容器

    列表容器

    集合

    多重集合

    映射

    多重映射

    内部数

    据结构

    连续存储的数组形式(一端开口的组)

    连续或分段连续存储数组(两端开口的数组)

    双向环状链表

    红黑树(平衡检索二叉树)

    红黑树

    红黑树

    红黑树

    头文件

    #include <vector>

    #include <deque>

    #include <list>

    #include <set>

    #include <set>

    #include <map>

    #include <map>

    定义容器

    vector<string> book(50);

    deque<string> book(50);

    list<string> book;

    set<string> book;

    multiset<string> book;

    map<int,string> book;

    multimap<int,string> book;

    操作元素的方式

    下标运算符:[0](可以用迭代器,但插入删除操作时会失效)

    下标运算符或迭代器

    只能用迭代器(不断用变量值来递推新值,相当于指针),不支持使用下标运算符

    迭代器

    迭代器

    迭代器

    迭代器

    插入删除操作迭代器是否失效

    插入和删除元素都会使迭代器失效

    插入任何元素都会使迭代器失效。删除头和尾元素,指向被删除节点迭代器失效,而删除中间元素会使所有迭代器失效

    插入,迭代器不会失效。删除,指向被删除节点迭代器失效

    插入,迭代器不会失效。删除,指向被删除节点迭代器失效

    插入,迭代器不会失效。删除,指向被删除节点迭代器失效

    插入,迭代器不会失效。删除,指向被删除节点迭代器失效

    插入,迭代器不会失效。删除,指向被删除节点迭代器失效

    特点

    增加和获取元素效率很高,插入和删除的效率很低

     

    增加和获取元素效率

    较高,插入和删除的

    效率较高

     

    增加和获取元素效率

    很低,插入和删除的

    效率很高

    1.键(关键字)和值(数据)相等(就是模版只有一个参数,键和值合起来)

    2.键唯一

    3.元素默认按升序排列

    1.键和值相等

    2.键可以不唯一

    3.元素默认按升序排列

    1.键和值分开(模版有两个参数,前面是键后面是值)

    2.键唯一

    3.元素默认按键的升序排列

    1.键和值分开

    2.键可以不唯一

    3.元素默认按键的升序排列

     

    3.    迭代器删除元素的会发生什么?

    答:分情况:关联容器和顺序容器两种:

    a.    对于序列式容器(如vector,deque,list等),删除当前的iterator会使后面所有元素的iterator都失效。这是因为vector,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。不过erase方法可以返回下一个有效的iterator。

    b.    对于关联容器(如map,set,multimap,multiset),删除当前的iterator,仅仅会使当前的iterator失效,只要在erase时,递增当前的iterator即可。这是因为map之类的容器,使用了红黑树来实现,插入,删除一个结点不会对其他结点造成影响。

  • 相关阅读:
    Cocos2d-x优化中关于背景图片优化
    Cocos2d-x优化中纹理优化
    Cocos2d-x优化中图片优化
    Cocos开发中性能优化工具介绍之Visual Studio内存泄漏检测工具——Visual Leak Detector
    Cocos开发中性能优化工具介绍之使用Windows任务管理器
    Cocos开发中性能优化工具介绍之Xcode中Instruments工具使用
    spring03autowire属性
    spring02IOC
    css10定位属性
    css09浮动属性
  • 原文地址:https://www.cnblogs.com/BEN-LK/p/10720355.html
Copyright © 2020-2023  润新知