一些STL
前言:
由于本人之前在使用 map 进行离散化时被喷了,并且不明白一些常用的STL怎么使用,所以恶补了一下
感谢 FQR 的指导
离散化
unique(tmp + 1, tmp + n + 1) 的执行原理是把把没有重复的放在前面,重复的所有元素都扔到后面,返回的值为第一个重复元素的下标
lower_bound(tmp + 1, tmp + len + 1, arr[i]) 像这种 STL 基本上返回的都是你想查找的这一位的迭代器, tmp 是首元素(相当于下标为0)的迭代器
lower_bound(tmp + 1, tmp + len + 1, arr[i]) - tmp 是求两个迭代器的距离(求出来就是下标)
// arr[i] 为初始数组,下标范围为 [1, n]
for (int i = 1; i <= n; ++i)
tmp[i] = arr[i];
std::sort(tmp + 1, tmp + n + 1); // STL基本上都是左闭右开的,所以右区间为n+1
int len = std::unique(tmp + 1, tmp + n + 1) - tmp -1; //因为返回的值为第一个重复元素的下标 ,所以有 -1
for (int i = 1; i <= n; ++i)
arr[i] = std::lower_bound(tmp + 1, tmp + len + 1, arr[i]) - tmp;//最后求出来值域也是从 1 开始的,因为原来下标就是1开始
用vector
tmp.end() 是最后一个元素迭代器的下一位
// std::vector<int> arr;
std::vector<int> tmp(arr); // tmp 是 arr 的一个副本
std::sort(tmp.begin(), tmp.end());
tmp.erase(std::unique(tmp.begin(), tmp.end()), tmp.end());
for (int i = 0; i < n; ++i)
arr[i] = std::lower_bound(tmp.begin(), tmp.end(), arr[i]) - tmp.begin();//这里值域从0开始,因为原来下标从0开始
set
multiset<int>s;
s.insert(x);
s.erase(x);//删掉所有x
s.erase(s.find(x));//删掉一个x
int pre=*prev(s.lower_bound(x));//前驱(第一个比x小的数)
int nxt=*s.upper_bound(x);//后继(第一个比x大的数)
int numx=s.count(x);//x的个数
s.clear();
优先队列
重载运算符
struct node{
int score;
bool operator<(const node k) const{
return score<k.score;//大根堆
return score>k.score;//小根堆
}
};

浙公网安备 33010602011771号