C++中的容器

来源:互联网 发布:程序员如何保护颈椎 编辑:程序博客网 时间:2024/04/27 13:35
C++中常用的容器有:顺序性容器(vator,deque,list),关联容器(map,set),容器适配器(queue,stack)
1.顺序性容器
    1.1 vector
        vector是一种动态数组,在内存中具有连续的存储空间,支持快速随机访问。由于有连续的存储空间,所以在插入和删除的操作方面效率比较慢。
        
        vector的另一个常见的问题是clear操作。clear只是把vector的size清为零,但vector中的元素在内存中并没有消除,所以在使用vector的过程中会发现内存消耗会越来越大,导致内存泄露,现在经常用的方法是swap函数来进行解决:
            利用swap函数,和临时对象交换,使V对象的内存为临时对象内存,而临时对象的内存为V对象的内存。交换以后,临时对象消失,释放内存。
                    vetor<int>().swap(V); 或者 V.swap(vector<int>());
    1.2 deque
        连续的存储结构,即其每个元素在内存上也是连续的,类似于vector,不同之处在于提供了两级数组结构,第一级完全类似于vector,代表实际容器;另一级维护容器的首位地址。这样,deque除了具有vector的所有功能外,还支持高效的首端插入和删除操作。
        vector只能在末端插入数据,而deque支持双端插入数据。
            
    1.3 list
        非连续存储结构,具有双链表结构,每个元素维护一对前向和后向的指针,因此支持前向和后向遍历。支持高效的随机插入和删除操作。但随机访问效率低下,由于需要额外维护指针,所以开销也比较大。
2. 关联容器
    2.1 map
        map是一种关联容器,该容器用唯一的关键字来映射相应的值,即具有key-value功能。map内部自建一棵红黑树(一种自平衡二叉树),这棵树具有数据自动排序的功能。所以在map内部所有的数据都是有序的,以二叉树的形式进行组织。
        在构造map时是按照一定的顺序进行的。map的插入和删除的效率比其他序列的容器高,因为对关联容器来说,不需要进行内存的拷贝和移动,只是指针的移动。由于map的每个数据对用红黑树上的一个节点,这个节点在不保存你的数据时,是占用16个字节的。一个父节点指针,左右孩子指针,还有一个枚举值(表示红黑色),所以map的其中的一个缺点就是比较占用内存空间。
    2.2 set
        set的底层使用红黑树实现,插入删除时仅仅移动指针即可。set中的元素都是唯一的,而且默认情况下会对元素进行升序排列。所以在set中,不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧值,再插入新元素。不提供直接存取元素的任何操作函数,只能通过迭代器进行间接存取。
3.容器适配器
    3.1 queue
        queue是一个队列,实现先进先出功能,queue不是标准的STL容器,却以标准的STL容器为基础。queue是在deque的基础上封装的。之所以选择deque而不选择vector是因为deque再删除元素的时候释放空间,同时重新申请空间的时候无需拷贝所有元素。
    3.2 stack
        stack是实现先进后出的功能。和queue一样也是内部封装了deque。
        

   
0 0
原创粉丝点击