《算法笔记》第六章
vector
vector是向量,可以理解成“变长数组”,使用前需要添加下列语句
1 2
| #include <vector> using namespace std;
|
定义
1 2 3
| vector<typename> name; vector<typename> Arrayname[arraySize]; vector<vector<int> > name;
|
访问
函数
1 2 3 4 5 6 7 8 9
| push_back(i); pop_back(); size() clear(); begin() end() insert(it,x); erase(it); erase(first.last);
|
迭代器
可以理解成指针
1
| vector <typename>::iterator it=vi.begin();
|
set
set是集合,自动递增排序,元素互不重复,使用前需要添加头文件
可以用来去重并升序排序
1 2
| #include <set> using namespace std;
|
定义
1 2
| set <typename> name; set<typename> Arrayname[arraySize];
|
访问
set只能用迭代器访问
1
| set<typename>::iterator it;
|
函数
1 2 3 4 5 6
| insert(x); find(value); erase(it); erase(value); erase(first,last); clear();
|
string
字符串,使用前需添加头文件
字符串可以直接通过加法拼接,直接比较大小(字典序)
1 2
| #include <string> using namespace std;
|
定义
string str="abc";
访问
str[i]
输入输出只能用cin和cout
迭代器
string迭代器支持直接加减某个数字
函数
1 2 3 4 5 6 7 8 9 10 11
| length() insert(pos,string); insert(it,it2,it3); erase(it); erase(first,last); erase(pos,length): clear(); substr(pos,len) find(str2) replace(pos,len,str2); replace(it1,it2,str2);
|
map
map可以将基本类型映射到基本类型,基本类型也可以是STL容器,使用前需添加头文件
可以用来建立字符(串)与整数之间的联系,判断大整数或者其他类型是否存在的题目,把map当bool数组用
1 2
| #include <map> using namespace std;
|
定义
如果是字符串到整数的映射必须使用string而不是char
1
| map<typename1,typename2> mp;
|
访问
迭代器
1 2 3
| map<typename1,typename2>::iterator it; it ->first it ->second
|
函数
1 2 3 4 5 6
| find(key) erase(it); erase(key); erase(first,last); size() clear();
|
queue
队列,使用前需添加头文件
1 2
| #include <queue> using namespace std;
|
定义
访问
使用front和back之前要先用empty判断一下队列是否为空
函数
1 2 3 4
| push(x); pop(); empty() size()
|
priority_queue
优先队列
定义
先添加和queue一样的头文件
1 2 3
| #include <queue> using namespace std; priority_queue<typename>name;
|
访问
函数
1 2 3 4
| push(x); pop(); empty() size()
|
优先级
基本数据类型
一般是数字大的优先级高,定义如下
1 2
| priority_queue<int> q; priority_queue<int,vector<int>,less<int>> q;
|
想让数字小的优先级大只需
1
| priority_queue<int,vector<int>,greater<int>> q;
|
结构体类型
在结构体里面重载小于号即可
1 2 3 4 5 6 7
| struct fruit{ string name; int price; friend bool operator < (fruit f1,fruit f2){ return f1.price < f2.price; } };
|
这样之后f1<f2就等价于f1.price<f2.price
再定义fruit类型的优先队列,内部就是以价格高的水果为优先级高
也可以把重载函数写在结构体外面
1 2 3 4 5 6
| struct cmp{ bool operator () (fruit f1, fruit f2){ return f1.price>f2.price; } } priority_queue<fruit, vector<fruit>, cmp> q;
|
stack
栈,后进先出的容器,使用前需加上头文件
1 2 3
| #include <stack> using namespace std; stack<typename> name;
|
访问
函数
1 2 3 4
| push(x); pop(); empty() size()
|
pair
把两个元素绑在一起作为一个合成元素,可以看成有两个元素的结构体
定义
1 2 3
| #include <utility> using namespace std; pair<typename1,typename2> name(value1,value2);
|
访问
比较
两个pair类型比较是先比较first再比较second
algorithm
使用前需添加头文件
1 2 3 4 5 6 7 8 9 10 11
| #include <algorithm> using namespace std; max(x,y) min(x.y) abs(x) swap(x,y); reverse(it,it2); next_permutation(序列); fill(区间,值); lower_bound(first,last,val) upper_bound(first,last,val)
|
sort
1
| sort(首元素地址,尾元素地址,比较函数(非必填));;
|
如果需要从大到小,则需要使用比较函数
1 2 3
| bool bmp(int a,int b){ return a>b; }
|
STL容器中,只有vector,string,deque可以用sort