stl容器学习

1. STL有6种序列容器类型 

1 vector

    向量 相当于一个数组
    在内存中分配一块连续的内存空间进行存储。支持不指定vector大小的存储。STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacituy()函数返回的大小,当超过此分配的空间时再整体重新放分配一块内存存储,这给人以vector可以不指定vector即一个连续内存的大小的感觉。通常此默认的内存分配能完成大部分情况下的存储。
   优点:(1) 不指定一块内存大小的数组的连续存储,即可以像数组一样操作,但可以对此数组
                  进行动态操作。通常体现在push_back() pop_back()
            (2) 随机访问方便,即支持[ ]操作符和vector.at()
            (3) 节省空间。
   缺点:(1) 在内部进行插入删除操作效率低。
            (2) 只能在vector的最后进行push和pop,不能在vector的头进行push和pop。
            (3) 当动态添加的数据超过vector默认分配的大小时要进行整体的重新分配、拷贝与释放

push_back Add element at the end (public member function)
pop_back Delete last element (public member function)
insert Insert elements (public member function)
erase Erase elements (public member function )

清空
clear();
注意,clear()和resize()都不一定使得vector变小,若欲释放内存,请使用vecobj.swap(vector<T, A>())

2 list
    双向链表
    每一个结点都包括一个信息快Info、一个前驱指针Pre、一个后驱指针Post。可以不分配必须的内存大小方便的进行添加和删除操作。使用的是非连续的内存空间进行存储。
   优点:(1) 不使用连续内存完成动态操作。
            (2) 在内部方便的进行插入和删除操作
            (3) 可在两端进行push、pop
   缺点:(1) 不能进行内部的随机访问,即不支持[ ]操作符和vector.at()
            (2) 相对于verctor占用内存多

push_front Insert element at beginning (public member function)
pop_front Delete first element (public member function)
push_back Add element at the end (public member function)
pop_back Delete last element (public member function)
insert Insert elements (public member function)
erase Erase elements (public member function)

list没有空间预留习惯,所以每分配一个元素都会从内存中分配,每删除一个元素都会释放它占用的内存。list在哪里添加删除元素性能都很高,不需要移动内存,当然也不需要对每个元素都进行构造与析构了,所以常用来做随机操作容器与vector不同是,当向容器中插入或删除元素后,链表迭代器指向元素将不变。 如果一个vector有5个元素,中间插入一个,那么第五个元素包含的值将是以前第四个元素的值,因此,迭代器指向的位置不变,但是数据不同。然而,在链表中插入新元素并不会移动已有的元素,而只是修改链接信息。 指向某个元素的迭代器仍然指向该元素,也就是值相同,链接的位置不同了。 

3 deque
   双端队列 double-end queue
   deque是在功能上合并了vector和list,看起来像是list和vector的结合品。
   优点:(1) 随机访问方便,即支持[ ]操作符和vector.at()
            (2) 在内部方便的进行插入和删除操作
            (3) 可在两端进行push、pop
   缺点:(1) 占用内存多

push_back Add element at the end (public member function)
push_front Insert element at beginning (public member function)
pop_back Delete last element (public member function)
pop_front Delete first element (public member function)
insert Insert elements (public member function)
erase Erase elements (public member function)

在标准库中vector和deque提供几乎相同的接口,在结构上它们的区别主要在于这两种容器在组织内存上不一样,deque是按页或块来分配存储器 的,每页包含固定数目的元素.相反vector分配一段连续的内存,vector只是在序列的尾段插入元素时才有效率,而deque的分页组织方式即使在 容器的前端也可以提供常数时间的insert和erase操作,而且在体积增长方面也比vector更具有效率。deque在开始和最后添加元素都一样快,并提供了随机访问方法,像vector一样使用[]访问任意元素,但是随机访问速度比不上vector快,因为它要内部处理堆跳转。

使用区别:
     1 如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector 
     2 如果你需要大量的插入和删除,而不关心随即存取,则应使用list 

     3 如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque


4 queue 
queue是一个适配器类,底层类默认为deque。 它不允许随机访问队列元素,甚至不允许遍历队列。可以将元素添加到队尾,查看队尾和队首的元素的值,检查元素数目和测试队列是否为空。 

5 priority_queue 
与queue的不同是,最大的元素总是在队首,也是一个适配器类,默认的底层类是vector。 
可以修改用于确定哪个元素放在队首的比较方式,方法是提供一个可选的构造函数参数。 

6 stack 
也是一个适配器类,默认的底层实现为vector。 不允许随机访问堆栈元素,甚至不允许遍历堆栈。可以压入到栈顶,从栈顶弹出元素,查看栈顶元素的值,检查元素数目和测试堆栈是否为空。 


2. STL有4种联合容器:set,multiset, map, multimap

联合容器将值与关键字关联在一起,使用关键字来查找值。 
关联容器的长处在于,它提供了对元素的快速访问。 与序列相似,联合容器也允许插入新元素,不过不能指定元素的插入位置。原因是联合容器通常包含用于确定数据存放位置的算法,以便能够很快检索信息。 

1 set,multiset 
前两种是在set头文件中(以前分别为set.h和multiset.h); 

值的类型与关键字相同。 set删除相同的元素,multiset不会。 

2 map,multimap 
后两种是在map头文件中(以前分别为map.h和multimap.h)。 
值的类型与关键字不同。 map关键字唯一,multimap关键字不唯一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值