文章目录
前言
最近,初学算法,通过阅读《算法训练营》一书,对c++ STL知识内容进行总结,由于这方面知识有很多,所以只做大致总结,总结了vector,stack,queue,list。初学者学术不精,希望看到的大佬多多提意见,码字不易点个赞吧。
1、STL简介
TL 是“Standard Template Library”的缩写,中文译为“标准模板库”。STL 是 C++ 标准库的一部分,不用单独安装。
2、容器通用函数
.size() 容器内的元素个数,无符号整型。
.empty() 判断容器是否为空,返回一个bool值。
.front() 返回容器第一个元素。
.back() 返回容器最后一个元素。
.begin() 指向容器第一个元素指针。
.end() 指向容器最后一个元素的下一个位置的指针。
.swap(b) 交换两个容器的内容。
::iterator 迭代器。
关于迭代器:迭代器是一个广义的指针,可以是指针,也可以是对其进行类似指针操作的对象。C++的迭代器是为了使算法独立于所使用的容器类型而设计的,也就是说,C++的STL算法不会因为受使用的容器类型而限制。ps:也不会受数据类型的限制,因为STL提供了模板。关于迭代器的一个小技巧是:<xxxx>尖括号里是什么类型,解引用出来就是什么类型。
3、vector
vector(向量)是一个封装了动态大小数组的顺序容器,关于顺序容器他们的相关性就只有一种,就是前后相邻,可以通过元素在序列中的位置访问对应的元素,支持数组表示法和随机访问。使用vector需要引用头文件#include<vector>。
3.1创建
vector能够存放各种类型的对象,可以是c++标准数据类型,也可以是结构体类型。
vector<int>a;创建一个空的vector
vector<int>a(100) 创建一个元素个数为100的vector。
vector<int>a(20,100) 创建一个元素个数为20,初值都为100的vector。
vector<int>a[5] 创建五个vector每个都是一个数组。
3.2添加
向vector中添加元素,可以从尾部添加,也可以从中间添加。
a.push_back(5); 在向量尾部添加一个元素5
a.insert(a.begin()+1,10); 在向量a.begin()+1指向元素前插入一个10
3.3删除
可以删除尾部元素,也可以删除指定元素区间,还可以清空整个向量
a.pop_back(); 删除向量的最后一个元素。
a.erase(a.begin()+1); 删除指定位置的元素(传入两个参数就是删除指定区间的元素);
a.clear() 清空向量
3.4遍历
可以用数组表示法,也可以用迭代器对向量元素进行遍历
for(int i=0;i<a.size();i++)
cout<<a[i]<<"\t";
for(vector<int >::iterator it=a.begin();it<a.end();it++)
cout<<*it<<"\t";
3.5改变向量大小
对于vector由于是动态的,所以可以改变大小,其中改变大小并不是在原空间上进行改变,而是找更大的内存空间,然后将原来的数据拷贝到新的空间上,释放原空间。resize方法可以改变当前向量的大小,如果它比当前向量大,则填充默认值,如果必当前向量小,则舍弃后面的部分。
a.resize(5) 将原来的向量大小改为5.
4、栈 stack
栈只允许在栈顶操作,不允许在中间位置进行插入和删除操作,不支持数组表示法和随机访问。使用stack是需要引入头文件#include<stack> 。栈的基本操作很简单,包括入栈 ,出栈,去栈顶,判断栈空,求栈大小。
stack<int > s :创建一个空栈s,数据类型int
push(x); x入栈
pop(); 出栈
top() 取栈顶(未出栈)
empty(); 判断栈是否为空,若为空则返回TRUE。
size(); 求栈大小,返回栈中的元素个数。
5、队列 queue
队列只允许从队尾入队,从队头出队,不允许在中间位置插入和删除,不支持数组表示法和随机访问。使用queue是需要引入头文件#include<queue>。队伍的基本操作很简单,包括入队,出队,去对头,判断对空,求对列大小。
queue<int > q 创建一个空队q,数据类型int
push(x) x入队
pop() 出队
front() 去对头
empty() 判断队列是否为空,如为空,则返回TRUE
size() 求队列大小,返回队列中的元素个数
6、list
list是一个双向链表,可以在常数时间内插入和删除,不支持数组表示法和随机访问。使用list时,需要引入头文件#include<list>
list的专用成员函数:
merge(b) 将链表b的内容插入pos的前面,b为空。
remove(val) 将链表翻转。
splice(pos,b) 将链表b的内容插入pos的前面,b为空。
reverse() 将链表翻转。
sort() 将链表排序。
unique() 将连续的相同元素压缩为单个元素。不连续的相同元素无法压缩,因此一般先排序后去重。
其他成员函数如下
push_front(x)/push)_back(x) x从链表头或尾入。
pop_front()/pop_back() 从链表头或尾出。
front()/back() 返回链表头或尾元素。
insert(p,t) 在p之前插入t。
erase(p) 删除p。
clear() 清空链表。