一、string
-
初始化:
- 直接赋值:
string s = "Hello Standard Library";
- 给定长度并为所有元素赋初值:
string s(8, 's');
- 直接赋值:
-
常用操作:
- 字符串拼接、比较:+,+=,<,>运算符,比较也可用compare(另一个字符串)
- 获取长度:length()
- 判空:empty()
- 截取子串:substr(起始位置, 偏移量)
- 替换:replace(起始位置, 偏移量, 要替换子串)
- 删除:erase(起始位置, 偏移量)
二、vector
-
初始化:
- 无参初始化:
vector<数据类型> v;
- 给定长度:
vector<数据类型> v(长度);
- 给定长度并为所有元素赋初值:
vector<数据类型> v(长度, 初始值)
- 无参初始化:
-
常用方法:
-
缩容扩容:resize(容量)
-
后方插入:push_back(元素)
-
中间插入:insert(位置, 元素)
-
迭代器遍历:
for(vector<int>::iterator it = v.begin(); it != v.end; i++) { // vector<int>::iterator 可换为 auto cout << *it << endl; }
-
下标遍历:
for(int i = 0; i < v.size(); it++) { cout << v[i] << endl; }
-
清空:clear()
-
三、set
集合,set里面的元素不能重复,会按从小到大排序
-
初始化:
set<int> s;
-
常用方法:
-
向集合中添加元素:insert(元素)
-
查找集合中某元素:find(元素)
if(s.find(某元素) != s.end()) { //找到元素 } else { //未找到元素 }
-
迭代器遍历:
for(auto it = s.begin(); it != s.end(); it++) { cout << *it << endl; }
-
清空:clear()
-
四、map
map会自动将所有键值对从小到大排序,底层数据结构是红黑树
-
初始化:
- 创建一个空map:
map<键类型, 值类型> m;
- 初始化并赋初值:
map<键类型, 值类型> m = {{键1, 值1}, {键2, 值2}};
- 创建一个空map:
-
常用方法:
-
添加/修改元素:map[键] = 值
-
查找某元素是否存在:count(“键”) != 0
-
迭代器遍历:
for(auto it = m.begin(); it != m.end(); it++) { cout << it->first << endl;//输出键 cout << it->second << endl;//输出值 }
-
清空:clear()
-
五、stack
栈,后进先出
- 初始化:
stack<元素类型> stack;
- 常用方法:
- 压栈:push(元素)
- 出栈:pop()
- 查看栈顶:top()
- 查看长度:size()
- 是否为空:empty()
- 清空:clear()
六、queue
队列,先进先出
- 初始化:
queue<元素类型> queue;
- 常用方法:
- 入队:push(元素)
- 出队:pop()
- 查看队首:front()
- 查看队尾:back()
- 查看长度:size()
- 是否为空:empty()
- 清空:clear()
七、algorithm
算法头文件
- 常用方法:
- 求最大值、最小值、绝对值:max(数字1, 数字2)、min(数字1, 数字2)、abs(整数)
- 交换位置:swap(参数1, 参数2)
- 反转两迭代器之间的元素顺序:reverse(迭代器1, 迭代器2)
- 填充:fill(起始位置, 结束位置, 元素)
- 排序:sort(起始位置, 偏移量, [比较器])
- 二分查找第一个大于等于给定元素的地址,需要先排序:
int pos = lower_bound(起始位置, 结束位置, 给定元素) - 起始位置;
- 二分查找第一个大于给定元素的地址,需要先排序:
int pos = upper_bound(起始位置, 结束位置, 给定元素) - 起始位置;
- 转为字符串:to_string(数字)
- 字符串转整型数:stoi(字符串)
- 字符串转浮点数:stod(字符串)
八、迭代器
迭代器可以访问顺序容器和关联容器中的元素。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似。
-
迭代器定义方式分类:
迭代器类型 写法 正向迭代器 容器类名::iterator 迭代器名; 常量正向迭代器 容器类名::const_iterator 迭代器名; 反向迭代器 容器类名::reverse_iterator 迭代器名; 常量反向迭代器 容器类名::const_reverse_iterator 迭代器名; -
迭代器用法:
迭代器都可以进行
++
操作。反向迭代器和正向迭代器的区别在于:- 对正向迭代器进行
++
操作时,迭代器会指向容器中的后一个元素; - 而对反向迭代器进行
++
操作时,迭代器会指向容器中的前一个元素。
通过迭代器可以读取它指向的元素,
*迭代器名
就表示迭代器指向的元素。通过非常量迭代器还能修改其指向的元素。注意,容器适配器 stack、queue 和 priority_queue 没有迭代器。容器适配器有一些成员函数,可以用来对元素进行访问。
- 对正向迭代器进行
-
迭代器功能分类:
-
正向迭代器。假设 p 是一个正向迭代器,则 p 支持以下操作:++p,p++,*p。此外,两个正向迭代器可以互相赋值,还可以用
==
和!=
运算符进行比较; -
双向迭代器。双向迭代器具有正向迭代器的全部功能。除此之外,若 p 是一个双向迭代器,则
--p
和p--
都是有定义的。--p
使得 p 朝和++p
相反的方向移动; -
随机访问迭代器。随机访问迭代器具有双向迭代器的全部功能。若 p 是一个随机访问迭代器,i 是一个整型变量或常量,则 p 还支持以下操作:
- p+=i:使得 p 往后移动 i 个元素。
- p-=i:使得 p 往前移动 i 个元素。
- p+i:返回 p 后面第 i 个元素的迭代器。
- p-i:返回 p 前面第 i 个元素的迭代器。
- p[i]:返回 p 后面第 i 个元素的引用。
此外,两个随机访问迭代器 p1、p2 还可以用 <、>、<=、>= 运算符进行比较。
p1<p2
的含义是:p1 经过若干次(至少一次)++
操作后,就会等于 p2。其他比较方式的含义与此类似。对于两个随机访问迭代器 p1、p2,表达式
p2-p1
也是有定义的,其返回值是 p2 所指向元素和 p1 所指向元素的序号之差(也可以说是 p2 和 p1 之间的元素个数减1)。
-
-
不同容器的迭代器的功能
容器 迭代器功能 vector 随机访问 deque 随机访问 list 双向 set / multiset 双向 map / multimap 双向 stack 不支持迭代器 queue 不支持迭代器 priority_queue 不支持迭代器