C Plus Plus Tricks in Competitive Programming
Lambda
在函数内定义伪函数,便于传递给函数指针作为参数的其他函数
ACM中利用其引用特性可优雅地处理局部变量,或者创建用于交互的函数
auto ask = [&](int i, int x) -> int {
cout << "? " << (i+1) << ' ' << x << '\n';
cout << flush;
int val;
cin >> val;
return val;
};
- PS:[&]表示捕获引用(直接访问定义匿名函数的函数中的局部变量)
- [=]表示捕获值,在创建lambda表达式时内部创建捕获变量的拷贝,后续调用时亦是访问拷贝中的内容
- ->int是可省的,c++11以上编译可推断返回类型
STL
Vector
push_back: 倍增方式增加内存,开辟内存和拷贝是$O(m)$的,$2+4+8+...=O(n)$,均摊为O(1)- 预留大小(倍增开出的总内存):
capacity()reserve() - 占用大小(实际使用的大小):
size()resize()assignPS:resize不会减小预留大小 - 特殊遍历方式
emplace_back在实现上效率是优于push_back的
提前reserve assign有助于优化时间和空间常数
lower_bound && upper_bound
返回大于等于的1分界点 && 返回大于的1分界点
accumulate
方便的求和
accumulate(1+all(a),0LL):用longlong累加a[1]->a[n]
max_element
max_element(1+all(a)):返回a[1]->a[n]第一个最大元素的迭代器