目录
vector:变长数组
- 头文件:#include<vector>
- 支持比较运算,按字典序
- 定义与赋值
vector<int> a; vector<int> a(10); 定义一个长度为10的vector数组 vector<int> a(10,3); 定义一个长度为10,所有元素都初始化为3的vector数组 vector<int> a[ ]={1,2,3,4,5};定义一个vector数组 vector<Rec> a; 可以定义一个以结构体为元素的vector数组
- 常用用法
a.size(); 返回vector数组的长度 a.empty(); 返回vector数组是否为空,为空则返回true a.clear(); 清空vector数组 a.begin(); 返回开头的迭代器 a.end(); 返回最后一个数的下一个数的迭代器 a.front(); 返回开头的值 a.back(); 返回结尾的值 (迭代器相当于指针,有如下关系) a[0]=*a.begin()=a.front(); a[a.size()-1]=*a.end()=a.back(); a.push_back(x); 在数组的结尾添加一个x元素 a.pop_back(); 把数组的结尾元素删掉
-
遍历与输出
数组下标遍历方式 for(int i=0;i<a.size();i++) cout<<a[i]; 迭代器遍历方式 for(auto i=a.begin();i!=a.end();i++) cout<<*i; 范围遍历方式 for(auto x:a) cout<<x;
pair:存储二元组
- 支持比较运算,按字典序
- 定义与赋值
pair<int,int> a={3,3}; 定义一个(3,3)的pair变量 pair<string,int> a; 定义一个元素类型不一样的pair变量 a=make_pair("hxq",3); a=("hxq",3); c++11里支持的写法
- 常用用法
a.first; 返回第一个值 a.second; 返回第二个值 pair<int ,pair<int,int>> a可以实现存储三个数值 pair<int ,int> a的常用场景:第一个元素用来排序,第二个元素不变
bool:布尔变量,存放true或false
string:字符串
- 头文件:#include<string>
- 定义与赋值
string s; 定义一个默认的空字符串 string s2=s1; 定义一个s2等于s1字符串 string s="hello"; 定义一个字符串并初始化 string s(10,'c'); 定义一个长度为10的字符串并把所有元素初始化为'c' cin>>s; 读入一个string字符串,不能读入空格 getline(cin,s); 读入一个string字符串,可以读入空格 getline(cin,s,' '); 读入一个string字符串,传入的第三个参数意思是遇到‘ ’停止 (注意string不能用scanf输入)
- 常用用法
s.size(); 返回string的长度 s.empty(); 返回string是否为空 s.substr(i,len); 提取s中从i开始,长度为len的一段子串 s.substr(i); 提取s中从i开始,直到结尾的一段子串 s.back(); 返回字符串的最后一个元素 s.pop_back(); 删除字符串的最后一个元素 string的相加:保证加法两边至少要有一个是string变量 string s3=s1+s2; s3为s1拼接上s2 string s3=s1+"is best"+'c'; string可以与字符串以及单个字符相加,这些字符串和字符会转为string 错误:string s3='c'+"is best"+s1; 加法运算从左至右,字符串不能与单个字符相加
- 遍历与输出
输出方式 cout<<s; printf("%s",s.c_str()); puts(s); 会自动补上换行符 遍历方式 for(int i=0;i<s.size();i++) cout<<s[i]; for(auto x:s) cout<<x; (在范围遍历里面改变x的值是不会改变s里的值的,除非一开始传址(auto &x:s))
queue :循环队列:先进先出
- 头文件:#include<queue>
- 定义与赋值
queue<int> q; 定义一个元素为int类型的队列 queue<Rec> q; 定义一个元素为结构体类型的队列
- 常用用法
q.push(x); 队头插入一个元素 q.pop(); 弹出队尾 q.front(); 返回队头的值 q.back(); 返回队尾
priority_queue:优先队列:大根堆或小根堆
- 头文件:#include<queue>
- 定义与赋值
priority_queue<int> q; 定义一个大根堆:堆顶元素为最大值 priority_queue<int,vector<int>,greater<int> q; 定义一个小根堆,堆顶元素为最小值 priority_queue<pair<int,int>> q; 定义一个元素类型为pair的大根堆
- 常用用法
q.push(x); 把元素插入堆 q.pop(); 删除堆顶元素 q.top(); 返回堆顶元素
stack:栈 :先进后出
- 头文件:#include<stack>
- 定义与赋值(同上)
- 常用用法
stk.push(x); 向栈顶插入一个元素x stk.pop(); 弹出栈顶元素
deque:双端队列:两端插入或删除
- 头文件:#include<deque>
- 定义与赋值(同上)
- 常用用法
q.begin(),q.end(); 返回头尾的迭代器 q.front(),q.back(); 返回队头队尾的元素 q.push_back(x); 从队尾入队 q.push_front(x); 从队头入队 q.pop_back(); 从队尾出队 q.pop_front(); 从队头出队 q.clear(); 清空队列
set:动态维护有序序列,不能有重复元素
multiset:动态维护有序序列,可以有重复元素
- 头文件:#include<set>
- 定义与赋值(同上)
- 常用用法
q.size(),q.empty(),q.clear(); q.begin(),q.end(); q.insert(x); 把元素x插入到集合q中,时间复杂度O(logn) q.find(x); 返回x的迭代器,如果没有则返回q.end(),时间复杂度为O(logn) q.count(x); 返回x出现的次数 q.erase(x); 1.输入的是一个数x,则代表删除所有的x,时间复杂度为O(k+logn) 2.输入的是一个迭代器,则删除这个迭代器,时间复杂度为O(logn) q.lower_bound(x); 查找大于等于x的元素中最小的那个,并返回其迭代器 q.upper_bound(x); 查找严格大于x的元素中最小的那个,并返回其迭代器
map:动态维护有序序列,键值对key-value的映射
multimap:动态维护有序序列,可以有重复元素
- 头文件:#include<map>
- 定义与赋值
map<string,int> q; map最吸引人的地方:[]操作符,即map可以像数组一样操作,时间复杂度O(logn) q["hxq"]=1; 即把1映射给hxq cout<<q["hxq"]; 会输出1
- 常用用法
q.size(),q.empty(),q.clear(); q.begin(),q.end(); q.insert(pair<key,value>); 把一个pair元素插入到集合q中,时间复杂度O(logn) q.find(x); 返回key值为x的二元组的迭代器,如果没有则返回q.end(),时间复杂度为O(logn) q.erase(pair<key,value>); 1.输入的是一个数x,则代表删除所有的x,时间复杂度为O(k+logn) 2.输入的是一个迭代器,则删除这个迭代器,时间复杂度为O(logn) q.lower_bound(pair<key,value>); 查找大于等于x的元素中最小的那个,并返回其迭代器 q.upper_bound(pair<key,value>); 查找严格大于x的元素中最小的那个,并返回其迭代器
unordered_set
unordered_map
unordered_multiset
unordered_multimap
- 定义用法同上
- 优势:增删改查的时间复杂度是O(1)
- 劣势:不支持lower_bound() / upper_bound(),迭代器的加加减减
bitset:存放二进制的串,压位运算
- 头文件:#include<bitset>
- 支持所有位运算以及==,!=等运算
- 定义与赋值
bitset<1000> a; 长度为1000的bitset集合 支持[]操作符 a[0]=1; a[1]=0;
- 常用用法
应用场景:要存储很大的bool数组,可以使用bitset来节省空间 a.count(); 返回有多少个1 a.any(); 判断是否至少有一个1 a.none(); 判断是否全为0 set(); 把所有位置置为1 set(k,v); 把k位置置为v reset(); 把所有位置置为0 flip(); 把所有位置取反,等价于~ flip(k); 把k位置取反