常用 STL 操作
常用 STL 操作
分割字符串
#include <sstream>
stringstream ss (s);
getline(ss, sno, ':');
// 结果放置在字符串 sno 中
Pair
pair<int, int> p;
p.first
p.second
make_pair(1, 2)
// <1, 2>
强制转换
stoi("123") // 123 string -> int
to_string(123) // "123" int -> string
暴力枚举数组元素
// next_permutation
#include <iostream> // std::cout
#include <algorithm> // std::next_permutation, std::sort
int main () {
int myints[] = {1,2,3};
std::sort (myints,myints+3);
do {
// ...
} while ( std::next_permutation(myints,myints+3) );
return 0;
}set 和 multiset
- set 容器会将插入的元素以特定的顺序排列,默认是从小到大
- set 和 multiset 的区别在于 multiset 中的元素允许重复
优点:使用红黑树实现,搜索操作拥有良好的性能 插入,查看,删除的时间复杂度均为 O(n)
// 插入elem元素,返回新元素的位置,pos 指出插入操作的搜寻起点
// 如果 pos 恰当可以加快速度
c.insert(pos,elem)
c.insert(elem)
// 删除
c.erase(beg, end)set 的交集,并集和差集
// 交集,共有元素插入 X
set_intersection(x1.begin(),x1.end(),x2.begin(),x2.end(),inserter(x,x.begin()));
// 并集,所有元素不重复插入 X
set_union(x1.begin(),x1.end(),x2.begin(),x2.end(),inserter(x,x.begin()));
// 差集
set_difference(x1.begin(),x1.end(),x2.begin(),x2.end(),inserter(x,x.begin()));优先队列
priority_queue<int, vector<int>, greater<int>> pq;
pq.push(elem);
elem = pq.top();
pq.pop();合并两个 vector
AB.reserve(A.size(), B.size()); // pre-allocate capacity
AB.insert(AB.end(), A.begin(), A.end());
AB.insert(AB.end(), B.begin(), B.end());
// 原地合并
A.insert(A.end(), B.begin(), B.end());不小于和不大于
lower_bound(ForwardIterator first, ForwardIterator last, val) 从first找到 last 寻找小于等于这个元素的位置,等于就停下来
upper_bound 从头开始找第一个比该元素大的位置,存在等于的时候返回的是大于元素的第一个位置,所以要进行回退才能移到等于的位置,配合 prev() 可以进行回退
如果没有找到,那么迭代器会在 begin() 的位置不动
大顶堆和小顶堆
// 大顶堆
priority_queue<int> q;
// 小顶堆
priority_queue<int, vector<int>, greater<int> > q;#枚举 #字符串