STL用法

C++各类容器函数用法

vector

插入:push_back() O(1)

删除:pop_back() O(1)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wWupp7Z4-1657076647144)(C:\Users\YYYYYKN\AppData\Roaming\Typora\typora-user-images\image-20220403151150380.png)]

查找:find(v.begin(),v.end(),待查找的数) O(n)

插入:insert(a,begin() + i, ……) 在第 i 个元素之前加插入

queue

不是随机访问容器,没有迭代器,也没有begin()这种迭代器

插入:push() O(1)
从队尾入队

删除:pop() O(1)
从队头出队

priority_queue

默认是大根堆,可以使用对元素取负来实现小根堆

插入:push() O(logn)

删除:pop() O(logn) 删除堆顶元素

查找:top() O(1) 查找堆顶元素

deque

双端队列,支持随机访问,即可以使用begin()/end()和[i]来取出元素,但是不能随意删除和插入(插入貌似是可以指定位置插入(使用insert()函数),但是为了维护队列的性质最好不要这样做)

插入:push_back() / push_front() O(1) 从队尾入队 / 从队头入队

删除:pop_back / pop_front O(1) 从队尾出队 / 从队头入队

list

不支持随机访问,但是可以使用迭代器遍历

插入:push_back() / push_front() O(1) 从队尾入列 / 从队头入列

使用insert()函数进行指定位置的插入:

删除[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OF45UGVP-1657076647146)(C:\Users\YYYYYKN\AppData\Roaming\Typora\typora-user-images\image-20220403160823664.png)]

直接使用erase()返回的指针,erase()会返回下一个对象的指针,而不要让用于删除的指针使用++

迭代器:支持begin() / end()之类和使用迭代器,但是由于不是随机访问容器,不能使用[i]来访问元素。

排序:由于list不是随机迭代器,因此不能直接用 sort(l.begin(),l.end()) 来排序,使用 l.sort() 成员T函数,默认升序,l.sort(greater()) 为降序

map<key,value>

对key自动排序,默认升序,使用map<T,T,greater>进行降序排列。键不可重复

插入:insert(pair<T,T>()) O(logn) 由于是键值对,因此插入时要使用pair合起来

删除:erase() O(logn) 可删除指定的键的元素,或删除迭代器所指的元素,或删除迭代器的指的区间的所有元素(左闭右开,erase(m.begin(),m.end())

查找:find() O(logn) 若存在返回迭代器,否则返回 mp.end()

​ count() O(logn) 只会返回 0 或者 1,判断某个数是否存在

由于map基于红黑树实现,因此有自己的成员函数find(),其参数是要查找的键的值。或使用count()来查找是不是等于1,因为每个键是不同的,因此只可能是0或1。

在使用迭代器对map进行遍历的时候,可使用map<T,T> :: iterator->first / second来取出键或值

set

用法和map一样,对元素自动排序,默认升序,使用set<T,greater>进行降序排列。键不可重复

stack

插入:push() O(1)

删除:pop() O(1)

查找:top() O(1) 只能获得栈顶元素

不支持使用 begin() / end() 之类的迭代器

排序函数sort

升序:sort(v.begin(), v.end())

降序:sort(v.rbegin(), v.rend())

对普通数组排序(升序):sort(v, v + n),对从数组 v 开始,到数组 v 中第 n 个元素排序。默认升序

对普通数组排序(降序):sort(v,v + n, greater())

lower_bound/upper_boumd

lower_bound( begin,end,num):从数组的 begin 位置到 end-1 位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回 end。通过返回的地址减去起始地址 begin(),得到找到数字在数组中的下标。

upper_bound( begin,end,num):从数组的 begin 位置到 end-1 位置二分查找第一个大于的数字,找到返回该数字的地址,不存在则返回 end。通过返回的地址减去起始地址 begin,得到找到数字在数组中的下标。

结构体排序重载

bool operator < (const  Node &node) const {return x == node.x ? y < node.y : x < node.x;}

或者是下面这种更浅显的写法

bool operator < (const  Node &node) const 
{
    if(x == node.x)
    {
        if(y == node.y)
            return z < node.z;
        else
        	return y < node.y; 
    }
    return x < node.x;
}

reverse

反转指定区间,传入首地址和结束地址(左闭右开)即可。

unique

去重函数,会把原先序列的相邻相同元素去掉。传入区间首地址和结束地址(左闭右开),返回去重后,新的数组结束地址。

next_permutation

生成全排列

传入区间首地址和结束地址(左闭右开),函数会给区间内元素重排为下一个排列的顺序。如果已经枚举完成没有下一个排列,那么返回false,否则返回true

需要注意的是,下一个排列是最小的字典序大于当前排列的排列。如果你想枚举所有的排列,你需要从字典序最小的排列开始,也就是全升序的排列开始。

#include<bits/stdc++.h>
using namespace std;
const int n = 4;
int a[n];
int main(){
	for(int i = 0; i < n; i ++){
		a[i] = i;
	}
	do{
		for(int i = 0; i < n; i ++){
			cout << a[i] << ' ';
		}
		cout << '\n';
	}while(next_permutation(a, a + n));
	return 0;
} 

substr()函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aqzWD6dT-1657076647147)(C:\Users\YYYYYKN\AppData\Roaming\Typora\typora-user-images\image-20220429151300015.png)]

注意!!!!!!!!第二个参数是字符数目!!!!!!!!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值