SRL容器
tips:stl容器中只有队列,优先队列和栈这三个是没有clear函数的,其他的都有
1.#include<vector>
vector是一个可变长数组,支持随机访问,不支持在任意位O(1)插入。为了保证效率,元素的增删一般应该在末尾进行。
1.1声明
#include<vector>
using namespace std;
int main()
{
vector<int> a({1,2,3}); //相当于一个长度动态变化的int数组
vector<int> b[233]; //相当于一个一维长233,第二位长度动态变化的int数组
struct rec{int x,y;};
vector<rec> c; //自定义的结构体类型也可以保存在vector中
}
1.2函数
(1)size() //a.size()
Size就是返回vector的实际长度(包含的元素个数)
(2)empty() //a.empty()
它返回的是一个bool值,如果是空的就返回true,非空就返回false
(3)clear() //a.clear()
把vector清空
(4)a.front() //a[0]
等价于a[0]
(5)a.back()
等价于a.[a.size()-1]
(6)push_back(x)
把元素x插入到vector a的尾部
(7)pop_back(x)
删除vector a的最后一个元素
1.3迭代器
迭代器就像STL容器的指针,可以用星号*操作符解除引用。
一个保存int的vector的迭代器声明方法为:vector<int>::iterator it;
vector的迭代器是“随机访问迭代器”,可以把vector的迭代器与一个整数相加减,其行为和指针的移动类似。可以把vector的两个迭代器相减,其结果也和指针相减类似,得到两个迭代器对应下标之间的距离。
每一个vector都有两个特殊迭代器,begin()和end()
bengin指向vector的第一个元素,end指向最后一个元素的后一个
*a.begin()的效果其实等同于a[0]
所有的容器都是左闭右开的一个结构,[begin,end),end函数返回的是vectoer的尾部,也就是第n个元素往后的边界,*a.end和a[n]一样都是数组越界,其中n=a.size();
1.4遍历vector
三种方案
1.下标来遍历
for(int i=0;i<a.size();i++)
cout<<a[i]<<endl;
2.使用迭代器来遍历
//这里为了方便也可以使用auto i=a.begin();
for(vector<int>::iterator i=a.begin();i!=a.end();i++)
cout<<*i<<endl;
3.范围遍历
for(int x:a) cout<<x<<endl;
2.#include<queue>
queue<int> q;
queue<double> a;
struct rec{
int a,b,c;
};
queue<rec> r;
以上是队列的基本定义方式
头文件queue主要包括循环队列queue和优先队列priority queue两个容器。
优先队列维护的是一个没有序的集合,插入顺序无所谓,弹出时会优先弹出最大的数。
2.1优先队列
2.1.1声明
priority_queue<int> q; //默认是大顶堆
priority_queue<int,vector<int>,greater<int>> q2; //小顶堆
值得一提的是,在优先队列中也是可以使用结构体优先队列的,但是要注意在结构体的定义中需要重载小于号。(大根堆是重载小于号,小根堆重载大于号)
至于为什么,有些复杂暂时不做了解,看一下代码
struct rec{
int a,b;
bool operator<(const rec &x)const{
return a>x.a;
}
}
2.1.2基本操作函数
q.push(1) // 把元素插入堆
q.pop() // 删除堆顶元素(最大值)
q.top() // 查询堆顶元素(最大值)
2.2循环队列
2.2.1基本操作函数
q.push(1) // 从队尾插入
q.pop() // 从队头弹出
q.front() // 返回队头元素
q.back() // 返回队尾元素