Leetcode中常用到的stl

前言

本文省略了部分最基本的操作比如 size() length() max()

1.排序

一般常用的排序算法就是sort, 其他的排序算法用到的较少

操作含义
sort(beg, end)beg, end都是迭代器,表示需要排序的范围
sort(beg, end, comp)默认用的是 < 运算符来比较元素(升序排列), 但也可以接受额外的参数来指定排序关系

关于重载(参考https://www.shuzhiduo.com/A/xl56pBBYzr/), 有两种方式

  1. 一种是在类内定义运算符比如:
 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;
     }
 };
  1. 如果这个类没有定义比较运算, 或者有但是不想重载运算符, 就可以对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适用于大多数情况

用法示例:

// 生成0到9之间的(包含)均匀分布的整数
uniform_int_distribution<unsigned> u(0,9);
default_random_engine e;  // 生成无符号随机整数
for (size_t i = 0; i < 10; ++i)
    // 将 u 作为随机数源
    // 每个调用返回值在指定范围内并服从均匀分布的值
    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); //二维数组所有元素的值都为18

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()
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值