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之类的容器,使用了红黑树来实现,插入,删除一个结点不会对其他结点造成影响。

原文地址:https://www.cnblogs.com/BEN-LK/p/10720355.html