C Plus Plus Tricks in Competitive Programming

Posted on Oct 28, 2025

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() assign PS: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]第一个最大元素的迭代器