前言:
C++STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作。vector封装数组,list封装了链表,map和set封装了二叉树等,在封装这些数据结构的时候,STL按照程序员的使用习惯,以成员函数方式提供的常用操作,如:插入、排序、删除、查找等。让用户在STL使用过程中,并不会感到陌生。(摘自博客园博主蔡军帅)
下面就让我们一起来学习STL中的那些强大的容器吧!
一、栈(stack)
1.Definition :
微软翻译:stack—— n. 堆栈;一堆;大量;许多;v.(使)放成整齐的一叠(或一摞、一堆)。
百度百科:栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
2.头文件:#include<stack>
3.定义stack类型:stack<type> s;(其中type为数据类型:如int、float、char等)
4.Correlation operation:
(1)s.push(item); //将item压入栈顶
(2)s.pop(); //删除栈顶的元素,但不会返回
(3)s.top(); //返回栈顶的元素,但不会删除
(4)s.size(); //返回栈中元素的个数
(5)s.empty(); //检查栈是否为空,如果为空返回true,否则返回false
二、队列(queue)
1.Definition:
微软翻译:queue—— n. 行列;(储存的数据)队列;v.(人、车等)排队等候;(使)排队;列队等待
百度百科:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。
2.头文件:#include<queue>
3.定义queue类型:queue<type> que;(其中type为数据类型,如int、float、char)
4.Correlation operation:
(1)q.push(item); //将item压入队列尾部
(2)q.pop(); //删除队首元素,但不返回
(3)q.front(); //返回队首元素,但不删除
(4)q.back(); //返回队尾元素,但不删除
(5)q.size(); //返回队列中元素的个数
(6)q.empty(); //检查队列是否为空,如果为空返回true,否则返回false
三、动态数组(Vector)
1.Definition:
微软翻译:vector —— n.向量;矢量;载体;(航空器的)航线;v.【航】(对飞行中的飞机)指示航向;【航】电(磁)波导航
百度百科:vector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确。它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
2.头文件:#include<vector>
3.定义vector类型:vector<type> vec;
4.Correlation operation:
------------------------------------------------------------------------------------------------------------------------------
(1)尾部插入数字:vec.push_back(a);
(2)使用下标访问元素:cout<<vec[0]<<endl;记住下标是从0开始的。
(3)使用迭代器访问元素:
vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl;
(4)插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;
(5)删除元素: vec.erase(vec.begin()+2);删除第3个元素
vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始
(6)向量大小:vec.size();
(7)清空:vec.clear();
(8)使用at()函数访问元素:cout<<vec.at(i)<<endl;
(8)用算法reverse实现逆序:
1) 使用reverse将元素翻转:需要头文件#include<algorithm>
reverse(vec.begin(),vec.end());将元素翻转,即逆序排列!
摘自:CSDN博主:那年聪聪
-----------------------------------------------------------------------------------------------------------------------------
四、Set
1.Definition:
微软翻译:n. 集;集合;一套;电视机;v. 设置;放;树立;安排
CSDN博主蔡军帅:关于set,必须说明的是set关联式容器。set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是set中数元素的值不能直接被改变。C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也称为RB树(Red-Black Tree)。RB树的统计性能要好于一般平衡二叉树,所以被STL选择作为了关联容器的内部结构。
2.头文件:#include<set>
set使用方法:
begin() ,返回set容器的第一个迭代器
end() ,返回set容器的最后一个迭代器
clear() ,删除set容器中的所有的元素
empty() ,判断set容器是否为空
max_size() ,返回set容器可能包含的元素最大个数
size() ,返回当前set容器中的元素个数
rbegin ,返回的值和end()相同
rend() ,返回的值和rbegin()相同
lower_bound(key_value) ,返回第一个大于或等于key_value的定位器
upper_bound(key_value),返回第一个一个大于key_value的定位器
如果找不到目标值迭代器等于end() 用upper_bound()==end()判断即可
五、Deque