前言
本文省略了部分最基本的操作比如 size() length() max()
1.排序
一般常用的排序算法就是sort, 其他的排序算法用到的较少
操作 | 含义 |
---|
sort(beg, end) | beg, end都是迭代器,表示需要排序的范围 |
sort(beg, end, comp) | 默认用的是 < 运算符来比较元素(升序排列), 但也可以接受额外的参数来指定排序关系 |
关于重载(参考https://www.shuzhiduo.com/A/xl56pBBYzr/), 有两种方式
- 一种是在类内定义运算符比如:
struct Node {
int a, b;
Node(int x, int y) {
a = x;
b = y;
}
bool operator < (const Node &c) const {
if(a == c.a) return b > c.b;
return a > c.a;
}
};
- 如果这个类没有定义比较运算, 或者有但是不想重载运算符, 就可以对sort单独自定义运算符, 单独自定义运算符也可以分为三种:类的写法 函数写法 lambda表达式写法
struct Node {
int a, b;
Node(int x, int y) {
a = x;
b = y;
}
};
struct compare {
bool operator()(const Node a, const Node b) {
if(a.a == b.a) return a.b > b.b;
return a.a > b.a;
}
} cmp;
bool cmp(const Node a, const Node b) {
if(a.a == b.a) return a.b > b.b;
return a.a > b.a;
}
sort(v.begin(), v.end(), [](const Node a, const Node b) {
if(a.a == b.a) return a.b > b.b;
return a.a > b.a;
});
2.数值算法
操作 | 含义 |
---|
accumulate(beg, end, init) | 求和, Init为初始值 |
accumulate(beg, end, init, binaryOp) | 默认用的是 + 运算符, 可以使用指定的二元操作 |
partial_sum(beg, end, dest) | 将新序列写入dest, 每个元素的值都等于输入范围中当前位置和之前位置上所有元素之和. 算法返回递增后的dest迭代器, 指向最后一个写入元素之后的位置 |
partial_sum(beg, end, dest, binaryOp) | 默认使用 + 运算符, 可以使用指定的二元操作 |
adjacent_difference(beg, end, dest) | 将新序列写入dest, 每个元素的值都等于输入范围中当前位置和前一个位置元素之差 |
adjacent_difference(beg, end, dest, binaryOp) | 默认使用 - 运算符, 可以使用指定的二元操作 |
iota(beg, end, val) | 将val赋予首元素并递增val, 将递增后的值赋予下一个元素 |
3.查找
操作 | 含义 |
---|
find(beg, end, val) | 返回一个迭代器, 指向输入序列中第一个等于val的元素 |
count(beg, end, val) | 返回一个计数器, 指出val出现了多少次 |
4.二分搜索
操作 | 含义 |
---|
lower_bound(beg, end, val, comp) | 返回一个迭代器, 表示第一个大于等于val的元素 |
upper_bound(beg, end, val, comp) | 返回一个迭代器, 表示第一个大于val的元素 |
5.通用重排操作
操作 | 含义 |
---|
reverse(beg, end) | |
reverse(beg, end, dest) | |
random_shuffle(beg, end) | |
random_shuffle(beg, end, rand) | 接受一个可调用对象参数, 该对象必须接受一个正整数值, 并生成0到此值的包含区间内的一个服从均匀分布非随机整数 |
shuffle(beg, end, Uniform_rand) | 第三个参数必须满足均匀分布随机数生成器的要求 |
copy(iter1, iter2, des_iter) | 复制 |
6.随机数
6.1随机数分布
操作 | 含义 |
---|
uniform_int_distribution< IntT> u(x, y) | 这个IntT可以被int short 等代替 |
uniform_real_distribution< RealT> u(x, y) | 这个RealT可以被float double 等代替 |
normal_distribution< RealT> n(m, s) | 均值为m(默认0.0), 标准差为s(默认1.0) |
注: c++程序不应该使用库函数rand, 而应该使用default_random_engine类和恰当的分类对象
6.2随机数引擎
操作 | 含义 |
---|
default_random_engine | 适用于大多数情况 |
用法示例:
uniform_int_distribution<unsigned> u(0,9);
default_random_engine e;
for (size_t i = 0; i < 10; ++i)
cout << u(e) << " ";
0 1 7 4 5 2 0 6 6 9
7.最小值和最大值
操作 | 含义 |
---|
min_element(beg, end, comp) | 返回一个迭代器 |
max_element(beg, end, comp) | 返回一个迭代器 |
8.容器
8.1容器通用操作
操作 | 含义 |
---|
c.begin() | 返回一个迭代器,它指向容器c的第一个元素 |
c.end() | 返回一个迭代器,它指向容器c的最后一个元素的下一个位置 |
c.rbegin() | 返回一个逆序迭代器,它指向容器c的最后一个元素 |
c.rend() | 返回一个逆序迭代器,它指向容器c的第一个元素前面的位置 |
swap(c1, c2)
\space
c1.swap(c2) | 交换元素, 会比拷贝更快 |
move(beg, end, dest) | 移动构造函数 |
c.resize(n, t) | 改变容器空间大小, 可选参数t为指定初始化值,不支持array |
c.insert(args) | 在不同容器中, 操作的接口会不同 |
c.empalce(args) | 在不同容器中, 操作的接口会不同 |
c.erase() | 在不同容器中, 操作的接口会不同 |
c.clear() | 在不同容器中, 操作的接口会不同 |
8.2顺序容器
关于容器类的总结可以参考另外一片博文:
链接: https://blog.csdn.net/qq_37612550/article/details/118994418?spm=1001.2014.3001.5501.
顺序容器类型:array、vector、deque、list、forward_list、string
array
array一般不支持修改空间大小比如添加\删除元素的操作和resize
操作 | 含义 |
---|
array.front() | |
array.back() | |
初始化array示例:
std::array<int, 100> a;
a.fill(18);
std::array<std::array<int,100>, 100> aa;
aa.fill(a);
vector
操作 | 含义 |
---|
vec.front() | |
vec.back() | |
vec.push_back(args) | |
vec.pop_back() | |
vec.insert(p, n, t)
\space
\space
vec.insert(p,b,e)
\space
\space
vec.insert(p,il) | |
deque(双端队列)
操作 | 含义 |
---|
deq.front() | |
deq.back() | |
deq.push_back(args) | |
deq.push_front(args) | |
deq.pop_front() | |
deq.pop_back() | |
deq.insert(p, n, t)
\space
\space
deq.insert(p,b,e)
\space
\space
deq.insert(p,il) | |
list(双向链表)
list不支持快速随机访问, 但是在链表任何位置插入或者删除元素都很快. 其他的操作跟deque很像, 刷题时基本不会用到
forward_list(单向链表)
forward_list 的操作和其他顺序容器不太相同, 刷题时基本不会用到
string
参考 https://blog.csdn.net/samkieth/article/details/50876347
操作 | 含义 |
---|
str.substr(pos) | 包含str中从pos开始的字符串的拷贝 |
str.substr(pos, n) | 可以指定拷贝的长度 |
str.insert(pos, args) | 在pos之前插入字符串或者字符args |
str.insert(pos, n, cha) | |
str.insert(iter, n, cha) | |
str.erase(pos, len) | 删除从位置pos开始的len个字符. 如果len被忽略, 则删除之后所有元素 |
str.append(args) | 将args追加到s. 返回一个指向s的引用 |
str.replace(range,args) | 将指定范围内的元素用args替换, range可以是一个下标pos加长度,也可以是一对迭代器 |
str.find(args) | str中查找args第一次出现的位置 |
str.rfind(args) | str中查找args最后一次出现的位置 |
to_string(val) | 返回数值val的string表示 |
stoi(str, p, b) | 返回起始子串(表示整数内容)的数值, 返回类型是int |
isdigit(char) | 判断字符是否是数字 |
8.3顺序容器适配器
stack
操作 | 含义 |
---|
sta.push() | |
sta.pop() | |
sta.top() | |
queue(单端队列)
操作 | 含义 |
---|
que.push() | |
que.back() | |
que.front() | |
que.pop() | |
priority_queue(优先队列、堆)
//升序队列,小顶堆
priority_queue <int,vector< int>,greater< int> > q;
//降序队列,大顶堆
priority_queue <int,vector< int>,less< int > >q;
操作 | 含义 |
---|
pri.push() | |
pri.front() | |
pri.top() | |
pri.pop() | |
8.4关联容器
map、set、multimap、multiset、unordered_map、unordered_set、unordered_multimap、unordered_multiset
关联容器额外的类型别名
操作 | 说明 |
---|
key_type | 此容器类型的关键字类型 |
mapped_type | 每个关键字关联的类型;只适用于map |
value_type | 对于set,与key_type相同 对于map,为pair<const_key_type, mapped_type> |
关联容器添加删除操作
操作 | 说明 |
---|
c.insert(v) | v是value_type类型的对象;args用来构造一个元素 |
c.emplace(args) | 函数返回一个pair,包含一个迭代器,指向具有指定关键字的元素,还有一个bool值 |
c.insert(b,e) | 略 |
c.insert(il) | 略 |
c.insert(p,v) | 返回一个迭代器 |
c.emplace(p,args) | 返回一个迭代器 |
c.erase(k) | k为key_type |
c.erase(
p
p
p) | p为迭代器 |
c.erase(b,e) | |
关联容器中的查找操作
注:lower_bound和upper_bound不适用于无序容器。
下标和at操作只适用于非const的map和unordered_map。
操作 | 说明 |
---|
c.find(k) | 返回迭代器 |
c.count(k) | 返回int |
c.lower_bound(k) | 返回一个迭代器,指向第一个关键字不小于k的元素 |
c.upper_bound(k) | 返回一个迭代器,指向第一个关键字大于k的元素 |
c.equal_range(k) | 返回一个迭代器pair,表示关键字等于k的元素的范围。若k不存在,pair的两个成员均等于c.end() |