C++11 std骚操作

bits库

<bits/stdc++.h>包括了C++的所有标准库。

<bits/extc++.h>史诗般的外挂,包含了__gnu_pbds的所有内容,包括gp_hash_tablerope等。打死我都不要自己写数据结构了!

类型推导

编译器根据右边的表达式自动判断返回类型。

然而这玩意随便用用就能自损一千,特别好用的地方就是声明迭代器循环变量。

基于范围的for循环

不用写那么多东西,太爽了!但是记得要将循环变量用引用声明,否则随随便便就能TLE。

#include <bits/stdc++.h>
using namespace std;
typedef vector<int> vi;
int main() {
  vi v = {1, 1, 4, 5, 1, 4, 1, 9, 1, 9};
  for (auto &i : v) {
    cout << i;
  }
  return 0;
}

运行结果:

1145141919

容器去重

<algorithm>里有一个unique函数,会将升序排序的容器中所有的除了第一次出现的元素全部扔掉。

用法:先排序,然后调用unique(start, end);

#include <bits/stdc++.h>
using namespace std;

#define trav(a, A) for (auto &a : A)
#define all(A) A.begin(), A.end()
typedef vector<int> vi;

int main() {
  vi v = {1, 1, 4, 5, 1, 4, 1, 9, 1, 9};
  sort(all(v));
  auto last = unique(all(v));
  v.erase(last, v.end());
  trav(it, v) {
    cout << it << " ";
  }
  return 0;
}

输出结果:

1 4 5 9

bitset

初始化:bitset<length> foo; 构造函数可以用一个数或01字符串做参数。

对象函数:

  • []运算符或test(pos)访问某一位。
  • all()判断是否全为1。
  • any()none()判断是否有1。
  • count()返回所有1的个数
  • set()reset()flip()改变某一位的值。若无参数传入,则对所有的位执行同样的操作。
  • to_string()to_ulong()变成01字符串和整数。

hash

C++11启支持对string类、bitsetvector<bool>的hashing,使用方法如下:

#include <bits/stdc++.h>
using namespace std;

int main() {
  string str1 = "That's good.";
  string str2 = "That's goood.";
  hash<string> h;
  
  cout << h(str1) << endl << h(str2);
  return 0;
}

运行结果:

2177240917276858684
14580988214652125085

发表评论

电子邮件地址不会被公开。 必填项已用*标注