c/c++

查找

1
2
#include <algorithm>
auto it=std::find(vec.begin(),vec.end(),a);

去重

1
auto new_end=std::unique(nums.begin(),nums.end());

删除

1
2
vec.erase(iter);
vec.remove(iter);

vector中的remove的作用是将等于value的元素放到vector的尾部,但并不减少vector的size

vector中erase的作用是删除掉某个位置position或一段区域(begin, end)中的元素,减少其size

删除所有重复元素

1
2
auto it=std::remove(vec.begin(),vec.end(),1);
std::erase(it,vec.end());

最大公约数

1
2
#include <iostream>
int t=__gcd(a,b);

优先队列

1
2
3
4
5
6
7
8
#include <queue>
priority_queue<int , vector<int> > pq; // 从大到小
priority_queue<int , vector<int> ,greater<int> >pq; // 从小到大
pq.push();
pq.pop();
pq.top();
priority_queue<struct PP , vector<struct PP> ,greater<struct PP> > pq; // 需要重载运算符 < >

求最大值

1
2
Iterator* it=max_element(vec.begin(),vec.end());
// 返回一个迭代器

查找一个不小于元素的迭代器

需要容器有序
返回一个迭代器,指向在有序区间[first, last)中第一个大于或等于value的元素。如果找不到这样的元素,则返回last。

1
2
3
4
5
6
auto it=lower_bound(vec.begin(),vec.end(),value);
// *it>=value || it==vec.end()
auto it=upper_bound(vec.begin(),vec.end(),value);
// *it > value || it==vec.end() 且找到第一个大于value的地址
auto it=upper_bound(p.begin(),p.end(),value,greater());
// 找到第一个小于value的地址

集合中是否存在某个值

1
2
unordered_set<int>st;
int cnt=st.count(value);

求二进制最低位1对应的值

1
2
// lowbit(4)=4; 4=0b100
int t=lowbit(x);

字符串

1
2
3
4
5
6
7
8
9
// 转成字符串
string to_string(int val);
// 将字符串转成int
int stoi(string s);

string s1="hello world";
string s2="hello"
int t=s1.find(s2); // 从左边找
int t=s1.rfind(s2);// 从右边找

pair

1
2
3
4
#include<utility>
pair<int,int>p1=make_pair(1,2);
vector< pair<int,int> >E[u];