您的位置:首页 > 产品设计 > UI/UE

STL概览-序列容器vector,deque,list

2008-12-12 10:31 661 查看
容器container

|->用来管理一组对象的集合,这里的对象叫做元素。

|->分类

| |->序列式容器

| | |->每个被插入的元素,都有一个固定的位置,这个位置取决于操作者(程序或者程序 | | 员或者用户)在什么时机将元素插入。但是一旦插入以后,位置不在发生改变,除非| | 你采取remove或者erase等措施。

| |->关联时容器

| |->被插入的元素并没有一个固定的位置。这不仅是指操作者可能更改其中元素的位置,| 还 有可能——每当新插入一个元素时,容器都会自动的按照某种排序规则将新来元| 素放置在合适的位置。也即,这种容器内元素的排列顺序由容器自己的排序规则决 | 定,操作者无能为力。

|->核心

| |--->所有容器都采用value语义,而不是reference语义。这就是说对于容器的元素必须满足 | | copyconstructor 和assignment,否则容器无法完成正常的工作,比如排序,交换,等。

| |--->每个容器都提供若干个用于接洽元素的接口——iterator。外界(包括STL的各种算法正式 | | 通过这种接口发生作用的。

| |--->几乎容器的所有操作都不保证安全性(个别除外,如.at()),STL在效率和安全平衡上的选择 | 是绝对倾向于前者的。

|->通用操作

|--->constructor

| |->default,copy,assignment

|--->general property

| |->.size() .max_size() .empty()

|--->comparison

| |->== ,!= ,>,<,>=,<=

|--->assignmnt

| |->=,.insert() .erase() .clear()

|--->iterator

|->.begin() .end() .rbegin() .rend()

==============================================================

序列式容器sequence container:每个被插入的元素,都有一个固定的位置,这个位置取决于操作者(程序或者程序员或者用户)在什么时机将元素插入。但是一旦插入以后,位置不在发生改变,除非你采取remove或者erase等措施。

==============================================================

vector

|

|->名称----->vector

|->应用----->大凡能用到动态数组的地方都用得到

|

|->个性

| |------> 随机存取,他多对应的迭代器iterator也具有随机的属性,即满足指针运算。

| |------> 当采用push_back添加元素时具有很高的效率,但如果是insert方式,情况就相当糟糕

|

|->陷阱

| |------> 我们可以采用reserve()来给已经做好的vector扩容,但你不能用他缩容。

| 一个邪门的方法是:vecotr<class> v.swap(v),这居然能办到?!(可我这不行)。

|

|->Type----->calss

|->Include---><vector>

|->Define---->vector<class>

|->Sub

| |------>constructor见容器的通用操作

| |------>其中的assignment有三种参数的情况:(n),(beg,end),(n,elem)

|

|->Fun

|------>NoModify operate

| |->.size() .max_size() .capacity() .empty() .reserve() 和comparisions

|------>assignment operate

| |->=,.assign() .swap()

|------>access operate

| |->[], .at() .front() .back()

|------>iterator

| |->.begin() .end() .rbegin() .rend()

|------>modify operate

|->.insert() .push_back() .pop_back() .resize() .clear()

[注]. Vector<class>针对class为bool的情况作了特殊的设计。动机很简单——bool没有必要用8个bit一个btye来存储。也就是说vector<bool>具有按位处理的能力,这在C++中是罕见的。所以多出了这么两个函数:.flip() [].flip() 前者对整个容器按位取反,后者指对一个元素[]这么做 。

==============================================================

Deque

|

|->名称----->deque

|->说明----->除了能那个两头同时添加元素外,deque跟vector并没有太大差别。

|->陷阱

| |------>deque不再支持内存的动态分配。

|

|->Type----->class

|->Include---><deque>

|->Define---->deque<calss>

|->Fun

|------>在vector中去掉了:.capacity() .reserve()

|------>在vector中多了:.push_front() .pop_front()

==============================================================

list

|

|->名称----->list

|->应用----->容器中的元素需要做大量的换位操作时。

|

|->个性

| |------>不能够随机存取,这导致它的iterator同样在运算上要被限制。

| |------>对元素作变化位置的操作是有很高的效率的,但如果要查找某个元素则很浪费时间。

| |------>根deque一样,它是双向的。

|

|->陷阱

| |------>不能针对iterator做+5之类的运算,但* & 仍然成立。

| |------>STL某些算法可能具有很低的效能(比如remove),这是因为list已经不再适合查找元素了

|

|->Type----->class

|->Include---><list>

|->Define---->list<class>

|->Fun

|------>在deque基础上少了:.at()

|------>在deque基础上多了:.remove() .remove_if() .unique() .splice() .sort()

.merge() .reverse()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐