C++各类容器函数用法
vector
插入:push_back() O(1)
删除:pop_back() O(1)
查找: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()函数进行指定位置的插入:
删除:
直接使用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()函数
注意!!!!!!!!第二个参数是字符数目!!!!!!!!!!!!