标准STL序列容器:vector、string、deque和list。
标准STL关联容器:set、multiset、map和multimap。
非标准的关联容器:hash_set、hase_multiset、hash_map和hash_multimap。
容器适配器:stack、queue、priority_queue。
以下简述几种常见容器:
1 vector 容器
vector的数据安排以及操作方式,与array非常相似。两者的唯一区别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能改变。vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。因此,vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们再也不必因为害怕空间不足而一开始要求一个大块的array。vector基于模板实现,需包含头文件<vector>。
(1)定义和初始化
vector<int> vec1; //默认初始化,vec1为空
vector<int> vec2(vec1); //使用vec1初始化vec2
vector<int> vec3(vec1.begin(),vec1.end()); //使用vec1初始化vec2
vector<int> vec4(10); //10个值初始化的元素
vector<int> vec5(10,4); //10个值为4的元素
(2)常用操作方法
vec1.push_back(t); //vec1末尾添加元素t
vec1.pop_back(); //删除末尾元素
unsigned int size = vec1.size(); //元素个数
bool isEmpty = vec1.empty(); //判断是否为空
vec1.clear(); //清空元素
vec1.insert(vec1.end(),5,3); //从vec1.back位置插入个值为的元素
vec1.erase(vec1.begin(),vec1.end()); //删除之间的元素,其他元素前移
(3)迭代器
vector<int>::const_iterator iter = vec1.begin();
注:vector动态增加大小,并不是在原空间之后持续新空间(因为无法保证原空间之后尚有可供配置的空间),而是以原大小的两倍另外配置一块较大的空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间。因此,对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了。
2 list 容器
List是stl实现的双向链表,而且是一个环状双向链表,与 向量(vectors)相比, 它允许快速的插入和删除就配置或释放一个元素空间。因此,list对于空间的运用有绝对的精准,但是随机访问却比较慢。需要添加头文件<list>。
(1)定义和初始化
list<int> lst1; //创建空list
list<int> lst2(3); //创建含有3个元素的list
list<int> lst3(3,2); //创建含有3个2元素的list
list<int> lst4(lst2); //使用lst2初始化lst4
list<int> lst5(lst2.begin(),lst2.end()); //同lst4
(2)常用操作方法
lst1.assign(lst2.begin(),lst2.end()); //分配值
lst1.push_back(10); //lst末尾添加值
unsigned int size = lst1.size(); //含有元素个数
lst1.pop_back(); //删除末尾值
bool isEmpty1 = lst1.empty(); //判断为空
lst1.clear(); //清空值
lst1.front(); //返回第一个元素的引用
lst1.back(); //返回最后一个元素的引用
lst1.insert(lst1.begin(),3,2); //从指定位置插入个
lst1.erase(lst1.begin(),lst1.end()); //删除元素
lst1.rbegin(); //返回第一个元素的前向指针
lst1.remove(2); //相同的元素全部删除
lst1.reverse(); //反转
lst1.merge(lst2); //合并两个list对象
lst1.splice(); //合并两个list对象
lst1.sort(); //排序
lst1.unique(); //删除相邻重复元素
(3)迭代器
list<int>::const_iterator iter = lst1.begin();
3 deque 容器
deque 是一种双向开口的连续线性空间,可以在队尾两端分别做元素的插入和删除操作。deque和vector的最大差异,一在于deque允许于常数时间内对起头端进行元素的插入或移除操作,push_front(),二在于deque没有所谓容量观念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并链接在一起。换句话说,像vector那样"因旧空间不足而重新配置一块更大空间,然后复制元素,再释放旧空间"这样的事情在 deque是不会发生的。
deque容器类与vector类似,支持随机访问和快速插入删除,它在容器中某一位置上的操作所花费的是线性时间。与vector不同的是,deque还支持从开始端插入数据:push_front()。其余类似vector操作方法的使用。需要添加头文件<deque>。
成员函数: push_front(),push_back(),pop_front(),pop_back(),size(),empty(),insert(),erase(),clear(),swap()。
迭代器:deque<int>::const_iterator iter = deq1.begin();
deque<int>::const_reverse_iterator iter = deq1.rbegin();
4 stack 容器
stack 是一种先进后出(First In Last Out , FILO)的数据结构。它只有一个出口,stack 允许新增元素,移除元素,取得最顶端元素。但除了最顶端外,没有任何其它方法可以存取stack的其它元素,stack不允许遍历行为。需要添加头文件<stack>。
成员函数:push(),top(),pop(),size(),empty(),getallocator()。不属于容器,只是容器适配器,不支持迭代器。
5 queue 容器
queue是一种先进先出(First In First Out,FIFO) 的数据结构。它有两个出口,queue允许新增元素,移除元素,从最底端加入元素,取得最顶端元素。但除了最底端可以加入,最顶端可以取出外,没有任何其它方法可以存取queue的其它元素。需要添加头文件<queue>。
成员函数:front(),back(),push_back(),pop_front(),size(),empty()。不属于容器,只是容器适配器,不支持迭代器。
6 priority_queue 容器
priority_queue是一个拥有权值观念的queue,它允许加入新元素,移除旧元素,审视元素值等功能。由于这是一个queue,所以只允许在底端加入元素,并从顶端取出元素,除此之外别无其它存取元素的途径。priority_queue带有权值观念,其内的元素并非依照被推入的次序排列,而是自动依照元素的权值排列(通常权值以实值表示)。权值最高者,排在最前面。需要添加头文件<queue>。
注:heap并不归属于STL容器组件,它是个幕后英雄,扮演priority queue的助手。priority queue允许用户以任何次序将任何元素推入容器中,但取出时一定按从优先权最高的元素开始取。按照元素的排列方式,heap可分为max-heap和min-heap两种,前者每个节点的键值(key)都大于或等于其子节点键值,后者的每个节点键值(key)都小于或等于其子节点键值。因此, max-heap的最大值在根节点,并总是位于底层array或vector的起头处;min-heap的最小值在根节点,亦总是位于底层array或vector起头处。STL 供应的是max-heap,用c++实现。
7 set 容器
set的特性是,所有元素都会根据元素的键值自动被排序。集合数据既充当存储元素又充当简码,不允许两个元素有相同的值。set是通过红黑树来实现的,由于红黑树(RB-tree)是一种平衡二叉搜索树,自动排序的效果很不错,所以标准的STL的set即以RB-Tree为底层机制。又由于set所开放的各种操作接口,RB-tree也都提供了,所以几乎所有的set操作行为,都只有转调用RB-tree的操作行为而已。需要添加头文件<set>。
成员函数:size(),max_size(),empty(),count(),find(),low_bound(),upper_bound(),equal_range(),insert(),erase(),clear(),swap()。
迭代器:set<int>::const_iterator iter = st1.begin();
set<int>::const_reverse_iterator iter = st1.rbegin();
8 multiset 容器
multiset的特性以及用法和set完全相同,唯一的差别在于它允许键值重复,因此它的插入操作采用的是底层机制RB-tree的insert_equal()而非insert_unique()。需要添加头文件<set>。
9 map 容器
map的特性是,所有元素都会根据元素的键值自动被排序。map的所有元素都是pair,同时拥有实值(value)和键值(key)。 pair的第一元素被视为键值,第二元素被视为实值。map不允许两个元素拥有相同的键值.由于RB-tree是一种平衡二叉搜索树,自动排序的效果很不错,所以标准的STL map即以RB-tree为底层机制。又由于map所开放的各种操作接口,RB-tree也都提供了,所以几乎所有的map操作行为,都只是转调RB-tree的操作行为。对于迭代器来说,可以修改实值,而不能修改key,Map会根据key自动排序。需要添加头文件<map>。
(1)定义和初始化
map<int,string> map1; //空map
(2)常用操作方法
map1[3] = "Saniya"; //添加元素
map1.insert(map<int,string>::value_type(2,"Diyabi")); //插入元素
map1.insert(make_pair<int,string>(4,"V5")); //插入元素
string str = map1[3]; //根据key取得value,key不能修改
int key = iter_map->first; //取得eky
string value = iter_map->second; //取得value
map1.erase(iter_map); //删除迭代器数据
map1.erase(3); //根据key删除value
map1.size(); //元素个数
map1.empty(); //判断是否为空map
map1.clear(); //清空所有元素
(3)迭代器
map<int,string>::const_iterator iter = map1.begin();
map<int,string>::const_reverse_iterator iter = map1.rbegin();
10 multimap 容器
multimap的特性以及用法与map完全相同,唯一的差别在于它允许键值重复,因此它的插入操作采用的是底层机制RB-tree的insert_equal()而非insert_unique。需要添加头文件<map>。