什么是 STL?
STL(Standard Template Library)是 C++ 标准模板库,里面提供了大量模板。
vector (不定长数组)
加载库:include < vector > 申明:vector < type > name (从0开始)
#include<vector>
vector<int> a; //相当于不定长int数组
vector<int> b[227];
//相当于第一维长227,第二位不定长的int数组
struct node{...};
vector<node> c; //自定义的结构体类型也可以保存在vector中
vector中元素在内存中连续,支持随机寻址(任意询问任一元素)。
但它不支持在任意位置 O(1)插入,增删操作一般在末尾进行。
v.push_back(x) 将元素 x 压入 v 末尾。v.clear() 清空 v 中所有元素。
v.begin() 指向 vector 中0号位置的元素的指针地址。
v.end() 指向 vector 中最后一个元素的下一个的指针地址。
应用:题目未知数组长度时,使用 vector 代替数组。
Q:迭代器 it ?(int类型)
A:指向内存中的地址。定义方式 vector<int> ::iterator it; 。
可以用它去 遍历 vector 数组 。用‘’*‘’取出指针,*it。
it++;//地址向后移一位 ( it+=2 在目前的部分版本中是可以的 )
输出地址指向的数:cout << (*it) << endl;(或 *(it+2) )。
【遍历vector<int> a,并输出它的所有元素】的两种方法:
for(int i=0;i<a.size();i++) cout<<a[i]<<endl;
for(vector<int>::iterator it=a.begin();it!=a.end();it++)
cout<<*it<<endl;
queue (先进先出)
加载库:include < queue > 申明:queue < type > name
queue中元素在内存中不一定连续。
q.push(x) 向队列 q 末尾加入元素 x 。
q.front() 返回队列 q 开头元素。q.back() 返回队列 q 末尾元素。
q.size() 返回队列 q 元素个数。q.empty() 返回队列 q 是否为空。
应用:SPFA算法,BFS。(需要先来先走的情况,扩展节点)
stack (后进先出)
加载库:include < stack > 申明:stack < type > name
stack中元素在内存中不一定连续。
t.top() 返回 t 栈顶元素。t.pop() 弹出 t 栈顶元素。
t.push(x) 将元素 x 压入 t 栈顶。
priority_queue (优先队列)
加载库:include < priority_queue > 申明:priority_queue < type > name
一般使用:priority_queue< int,vector<int>,greater<int> > q; //小根堆
( 注意有三个元素要写,vector<int>无意义,但要写;或者只写前面的一个也可以 )
重载小于号:
struct node{ //默认大根堆
int x,y; //先按和排序,再按x排序
bool operator<(const node &v) const {
if(x+y!=v.x+v.y) return x+y < v.x+v.y; //按总分排序
return x<v.x; //按x排序
} //重载之后才变为从小到大排序
};
priority_queue<int> q;
优先队列就是堆,支持在队列中加入元素、取堆顶、删除堆顶。
堆中会认为“大”的更“小”,??????
q.top() 返回 q 中堆顶。q.pop() 弹出 q 中堆顶。
q.push(x) 将 x 压入 q 中。
deque(双端队列)
加载库:include < deque > 申明:deque < type > name
双端队列:支持在两端高效地插入删除元素的连续线性存储空间。
begin/end:deque的头/尾迭代器。
front/back:队头/队尾元素(迭代器指向的元素)。
push_back/push_front:从队尾/队头入队。
pop_back/pop_front:从队尾/队头出队。
clear:清空队列(O(n))。
set (去重并已经排序的集合)
加载库:include < set > 申明:set < type > name
set支持插入、删除、查找元素,并且支持查询大于(等于)某值的最小元素。
s.insert(x) 将 x 加入集合 s 中。s.begin() 返回集合 s 第一个元素的迭代器。
s.end() 返回集合最后一个元素下一个位置的迭代器。
//↑↑↑已去重集合
for(set<int> ::iterator it=s.begin(); it!=s.end(); it++)
cout<<(*it)<<endl;
//↓↓↓未去重集合
for(multiset<int> ::iterator it=s.begin(); it!=s.end(); it++)
cout<<(*it)<<endl;
multiset (可重集合)
加载库:include < multiset > 申明:multiset < type > name
multiset与 set 相同,但允许集合中有多个相同元素。
map (散列表&&映射关系)
加载库:include < map > 申明:map < type1,type2 > name
map是一种关联容器,提供一对一映射处理的能力。
map<int,int> a;
int main(){
a[2]=5; a[3]=6;
//pair<int,int> (2,5)
cout << (*a.find(2)).first << endl;
cout << (*a.find(2)).second << endl;
cout << (a.find(2)==a.end()) << endl;
//a.find(2)返回迭代器所表现的位置
}
pair (将2个数据组合成一个数据)
// 排序时,默认先比较第一关键字,再比较第二关键字。
typedef pair<int,int> mp;
mp b[10]={mp(2,4),mp(3,5),mp(1,5),mp(2,3)};
int main(){
sort(b,b+4);
for(int i=0;i<4;i++)
cout<<b[i].first<<" "<<b[i].second<<endl;
}
stl中复杂度的比较
auto (自动寻找元素类型)
auto it = v.begin(); //用auto赋初始值,自动寻找it类型
for(auto x:v) cout<<x<<endl; //按顺序从前到后输出