C++标准模板库
vector
使用
#include<vector>
using namespace std;
定义
vector<typename> name;
注意区分
vector<typename> Arrayname[arraySize];
vector<vector<int> > name; //注意>>之间的空格
元素访问
//通过下标访问
vector<int> vi;
vi[i];
//通过迭代器访问
vector<int>::iterator it=vi.begin();
*(it+i);
//遍历的一种方法,注:不支持it<vi.end()
for(vector<int>::iterator it=vi.begin();it!=vi.end();it++){
printf("%d ",*it);
}
//注:只有在vector和string中,才能使用vi.begin()+3这种迭代器整数的写法。
常用函数
常用函数 | 作用 | 时间复杂度 |
---|---|---|
begin() | 返回首部迭代器 | O(1) |
end() | 返回尾部+1迭代器 | O(1) |
push_back(i) | 在尾部插入元素i | O(1) |
pop_back() | 在尾部删除元素 | O(1) |
size() | 返回元素个数 | O(1) |
clear() | 清空元素 | O(N) |
insert(it,x) | 在任意迭代器it处插入x | O(N) |
erase(it) | 删除it处元素 | O(N) |
erase(first,last) | 删除[first,last)处元素 | O(N) |
常见用途
-
存储数据
-
用邻接表存储图
set
使用
#include<set>
using namespace std;
定义
set<typename> name;
set<typename> Arrayname[arraySize];
元素访问
//只能通过迭代器访问
set<int>::iterator it=st.begin();
// *(it+i); 不能这么写。只有在vector和string中,才能使用(it+i)这种迭代器整数的写法。
//遍历的一种方法,注:不支持it<vi.end()
for(vector<int>::iterator it=st.begin();it!=st.end();it++){
printf("%d ",*it);
}
//set 自动递增排序,自动去除重复元素
常用函数
常用函数 | 作用 | 时间复杂度 |
---|---|---|
begin() | 返回首部迭代器 | O(1) |
end() | 返回尾部+1迭代器 | O(1) |
insert(x) | 将x插入set,自动递增排序和去重 | O(logN) |
find(value) | 返回set对应值为value的迭代器 | O(logN) |
size() | 返回元素个数 | O(1) |
clear() | 清空元素 | O(N) |
erase(value) | 删除值为value元素 | O(logN) |
erase(it) | 删除it迭代器处元素 | O(1) |
erase(first,last) | 删除[first,last)迭代器处元素 | O(last-first) |
常见用途
- 自动去重并按升序排序
延申:
- 处理不去重的:multiset
- 只去重不排序:unordered_set(C++11)
string
使用
//注string和string.h完全不同
#include<string>
using namespace std;
定义
string str;
string str="abcd";
元素访问
//通过下标访问
string str="abcd";
str[i];
//如果读入和输出字符串则用cin和cout
cin>>str;
cout<<str;
//也可以用printf()
printf("%s\n",str.c_str());
//通过迭代器访问
string::iterator it=str.begin();
*(it+i);
//遍历的一种方法,注:不支持it<vi.end()
for(string::iterator it=str.begin();it!=str.end();it++){
printf("%d ",*it);
}
//注:只有在vector和string中,才能使用vi.begin()+3这种迭代器整数的写法。
常用函数
常用函数 | 作用 | 时间复杂度 |
---|---|---|
运算符 += | 拼接字符串 | |
比较运算符 | 按字典序比较大小 | |
insert(pos,string) | 在pos号位置插入字符串string | O(N) |
insert(it,it2,it3) | it为原字符串欲插入位置,it2,it3为待插字符串的首尾迭代器 | O(N) |
size()/length() | 返回string长度 | O(1) |
clear() | 清空元素 | O(1) |
erase(pos,length) | pos为需要删除的起始位置,length为删除的字符个数 | O(N) |
erase(it) | 删除it迭代器处元素 | O(N) |
erase(first,last) | 删除[first,last)迭代器处元素 | O(N) |
substr(pos,len) | 返回从pos开始,长度为len的字串 | O(len) |
string::npos | 是一个常数,find函数失配的返回值,-1或者4294967295都对 | |
find(str2) | 返回其在str中第一次出现的位置或者string::npos | O(str.length()*str2.length()) |
find(str2,pos) | 返回其在str中pos号开始第一次出现的位置或者string::npos | O(str.length()*str2.length()) |
replace(pos,len,str2) | 把str从pos号位开始、长度为len的子串替换为str2 | O(str.length()) |
replace(it1,it2,str2) | 把str迭代器[it1,it2)的子串替换为str2 | O(str.length()) |
map
使用
#include<map>
using namespace std;
定义
map<typename1, typename2> name;//不能用char数组,可以改用string
元素访问
//通过下标访问,map的键唯一
map<char,int> mp;
mp['c'];
//通过迭代器访问
map<char,int>::iterator it;
//遍历的一种方法
for(map<char,int>::iterator it=mp.begin();it!=mp.end();it++){
printf("%c %d\n",it->first,it->second);
}
//map会以键从小到大的顺序自动排列
常用函数
常用函数 | 作用 | 时间复杂度 |
---|---|---|
begin() | 返回首部迭代器 | O(1) |
end() | 返回尾部+1迭代器 | O(1) |
find(key) | 返回键为key的映射的迭代器 | O(logN) |
size() | 返回元素个数 | O(1) |
clear() | 清空元素 | O(N) |
erase(key) | 删除键为key的元素 | O(logN) |
erase(it) | 删除it处元素 | O(1) |
erase(first,last) | 删除[first,last)处元素 | O(last-first) |
常见用途
- 建立字符或字符串与整数之间的映射
- 判断大整数或者其他数据类型是否存在
- 字符串与字符串的映射
延申
- 一键多值:multimap
- 只映射不排序:unordered_map(C++11)
queue
使用
#include<queue>
using namespace std;
定义
queue<typename> name;
元素访问
//只能通过front()访问队首和back()访问队尾
queue<int> q;
q.front();
q.back();
常用函数
常用函数 | 作用 | 时间复杂度 |
---|---|---|
push(x) | 将x入队尾 | O(1) |
front() | 访问队首元素 | O(1) |
back() | 访问队尾元素 | O(1) |
pop() | 将队首元素出队 | O(1) |
empty() | 判空,返回true或 false | O(1) |
size() | 返回元素个数 | O(1) |
常见用途
- 广度优先搜索
延申
- 双端队列:deque
- 优先队列:priority_queue
priority_queue
使用
#include<queue>
using namespace std;
定义
priority_queue<typename> name;
元素访问
//只能通过top()访问队首
priority_queue<int> q;
q.top();
常用函数
常用函数 | 作用 | 时间复杂度 |
---|---|---|
push(x) | 将x入队尾 | O(logN) |
top() | 访问队首元素 | O(1) |
pop() | 将队首元素出队 | O(logN) |
empty() | 判空,返回true或 false | O(1) |
size() | 返回元素个数 | O(1) |
优先级设置
//基本数据结构
//下面两个都是数字大的优先级大
priority_queue<int> q;
priority_queue<int, vector<int>, less<int> > q;
//下面表示数字小的优先级大
priority_queue<int, vector<int>, greater<int> > q;
//结构体
//方法一,重载小于号(大于号会出现编译错误)
struct fruit{
string name;
int price;
friend bool operator < (const fruit &f1, const fruit &f2){
return f1.price<f2.price;
}
};
priority_queue<fruit> q;
//方法二,cmp函数
struct fruit{
string name;
int price;
};
struct cmp{
bool operator () (const fruit &f1, const fruit &f2){
return f1.price<f2.price;
}
}
priority_queue<fruit, vector<fruit>, cmp > q;
常见用途
- 一些贪心问题
- 优化Dijkstra算法
stack
使用
#include<stack>
using namespace std;
定义
stack<typename> name;
元素访问
//只能通过top()访问栈顶元素
stack<int> st;
st.top();
常用函数
常用函数 | 作用 | 时间复杂度 |
---|---|---|
push(x) | 将x入栈 | O(1) |
top() | 访问栈顶元素 | O(1) |
pop() | 弹出栈顶元素 | O(1) |
empty() | 判空,返回true或 false | O(1) |
size() | 返回元素个数 | O(1) |
常见用途
- 模拟递归
pair
使用
//<map>里面自带<utility>
#include<utility>
using namespace std;
定义
pair<typename1, typename2> name;
//举例
pair<string, int> p;
pair<string, int> p("haha", 5);
//临时pair
pair<string, int>("haha", 5);
make_pair("haha",5);
元素访问
//pair中只有两个元素,分别是first和second,按照结构体的方式访问即可。
pair<string, int> p("haha", 5);
p.first;
p.second;
常用函数
常用函数 | 作用 | 时间复杂度 |
---|---|---|
比较运算符 | 先判断first大小,当first相等时再判断second |
常见用途
- 替代二元结构体和构造函数
- 作为map的键值对进行插入
algorithm
使用
#include<algorithm>
using namespace std;
常用函数
常用函数 | 作用 | 时间复杂度 |
---|---|---|
max(x,y) | 返回最大值,可嵌套(可以是浮点数) | |
min(x,y) | 返回最小值,可嵌套(可以是浮点数) | |
abs(x) | 返回x的绝对值(不可以是浮点数) | |
swap(x,y) | 交换x和y的值 | |
reverse(it,it2) | 反转迭代器在[it,it2)的元素 | |
next_permutation(it,it2) | 给出迭代器[it,it2)在全排列的下一个序列 | |
fill(it,it2,value) | 迭代器在[it,it2)的元素赋值value | |
sort(it,it2) | 迭代器在[it,it2)的元素递增排序 | |
sort(it,it2,cmp) | 迭代器在[it,it2)的元素按cmp函数排序 | |
lower_bound(first,last,val) | 寻找[first,last)范围内第一个值大于等于val的元素的位置 | O(log(last-first)) |
upper_bound(first,last,val) | 寻找[first,last)范围内第一个值大于val的元素的位置 | O(log(last-first)) |