STL常用容器
stack
stack翻译为栈,是STL中实现的一个后进先出的容器。stack没有迭代器,因此无法通过下标快速访问元素(C ++迭代器用于对数据结构中的元素进行顺序访问或随机访问)。
(1)push()
push(x)将x入栈
(2)top()
top()获得栈顶元素
(3)pop()
pop()用以弹出栈顶元素
(4)empty()
empty()可以检测stack是否为空;返回true为空,返回false为非空
(5)size()
size()返回stack内元素的个数
注意:
在使用pop()和top()函数之前必须先使用empty()函数判断栈是否为空。
vector
vector翻译为向量,vector是为了实现动态数组的容器,是一种顺序容器,在内存中按顺序排列,因此可以通过下标([ ])快速访问,时间复杂度为o(1)。
(1)begin()
返回指向容器中第一个元素的迭代器,可以用于获取第一个元素:vector.begin()
begin()可以用于向量的初始化
//将向量b中从0-2(共三个)的元素赋值给a,a的类型为int型
vector<int>a(b.begin(),b.begin+3);
(2)end()
返回指向容器最后一个元素所在位置后一个位置的迭代器,如果要获取最后一个元素:vector.end() - 1
(3)front()
获取第一个元素
(4)back()
获取最后一个元素
(5)empty()
检测vector是否为空;返回true为空,返回false为非空
(6)size()
返回vector内元素的个数
(7)push_back()
push_back(x) 将x添加到vector尾部
(8)pop_back()
删除尾部的元素
(9)erase()
删除指定位置或者指定范围的元素:vector.erase(vector.begin() + 3) vector.erase(vector.begin(), vector.begin() + 3)
(10)insert()
在指定位置插入元素
vector.insert(vector.begin(), 10) 在vector的头部插入值为10的元素
vector.insert(vector.begin(), 2, 10) 在vector的头部插入两个值为10的元素
(11)reverse()
翻转指定范围内的元素
reverse(vector.begin(), vector.end()) 翻转向量的所有元素
queue
队列,简称对,是一种操作受限的线性表。限制为:只允许在队首删除(出队),队尾插入(入队),其特点是先进先出。没有迭代器,因此无法通过下标快速访问元素。
(1)push()
push(x)将x压入队列
(2)pop()
弹出队首元素
(3)front()
访问队首元素
(4)back()
访问队尾元素
(5)empty()
empty()可以检测queue是否为空,返回true为空,返回false为非空
(6)size()
size()返回queue内元素的个数
deque
双向队列,可以在队头和队尾插入数据,对应的也可以在队头和队尾删除数据。deque有迭代器,可以通过下标([ ])快速访问。
(1)begin()
返回指向容器中第一个元素的迭代器,可以用于获取第一个元素:deque.begin()
begin()可以用于向量的初始化
//将向量b中从0-2(共三个)的元素赋值给a,a的类型为int型
deque<int>a(b.begin(),b.begin+3);
(2)end()
返回指向容器最后一个元素所在位置后一个位置的迭代器,如果要获取最后一个元素:deque.end() - 1
(3)front()
获取第一个元素
(4)back()
获取最后一个元素
(5)empty()
检测vector是否为空;返回true为空,返回false为非空
(6)size()
返回vector内元素的个数
(7)push_front()
push_front(x) 将x添加到deque头部
(8)push_back()
push_back(x) 将x添加到deque尾部
(9)pop_front()
删除头部的元素
(10)pop_back()
删除尾部的元素
(11)erase()
删除指定位置或者指定范围的元素:deque.erase(deque.begin() + 3) deque.erase(deque.begin(), deque.begin() + 3)
(12)insert()
在指定位置插入元素
deque.insert(deque.begin(), 10) 在vector的头部插入值为10的元素
deque.insert(deque.begin(), 2, 10) 在vector的头部插入两个值为10的元素
(13)reverse()
翻转指定范围内的元素
reverse(deque.begin(), deque.end()) 翻转向量的所有元素
priority_queue
优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。
和队列基本操作相同:
- top 访问队头元素
- empty 队列是否为空
- size 返回队列内元素个数
- push 插入元素到队尾 (并排序)
- emplace 原地构造一个元素并插入队列
- pop 弹出队头元素
- swap 交换内容
定义:priority_queue<Type, Container, Functional>
Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆
一般是:
//升序队列(小顶堆) priority_queue <int,vector<int>,greater<int> > q; //降序队列(大顶堆) priority_queue <int,vector<int>,less<int> >q; //greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)
unordered_map
1、头文件
#include< unordered_map>
2、定义一个哈希表(key和value都是以int为例)
unordered_map<int,int> Hash; 第一个是key,第二个是value,key的值是唯一的。
哈希表的查找
it = Hash.find(1);
如果找不到返回的是Hash.end();
it = Hash.count(1);
找不到返回的是0,否则返回1
使用count,返回的是被查找元素的个数。如果有,返回1;否则,返回0。注意,map中不存在相同元素,所以返回值只能是1或0。
使用find,返回的是被查找元素的位置,没有则返回map.end()。
string
substr()函数
形式:s.substr(pos, len)
返回值: string,包含s中从pos开始的len个字符的拷贝(pos的默认值是0,len的默认值是s.size() - pos,即不加参数会默认拷贝整个s)
异常 :若pos的值超过了string的大小,则substr函数会抛出一个out_of_range异常;若pos+n的值超过了string的大小,则substr会调整n的值,只拷贝到string的末尾。
例如:s.substr(2)表示从字符串第三个元素开始复制到末尾。
stoi()函数
- 作用:将 n 进制的字符串转化为十进制
- 用法stoi(字符串,起始位置,n进制(默认10进制)),将 n 进制的字符串转化为十进制
- 举例:stoi(str, 0, 2); //将字符串 str 从 0 位置之后的数字的 2 进制数,转换为十进制
to_string()函数
将数值转化为字符串。返回对应的字符串。
一些常见的算法知识