Intro
简单整理了一些关于 C++ STL 的注意点。
虽然大多数东西可以手写不过某些东西最好少造轮子,善用 STL 可以节约很多考场时间,简化实现。
当然是时空限制和功能足够的前提下。
Tips
-
开
bool
数组是如果发现空间不是很对可以考虑std::bitset
或std::vector<bool>
。不过仅仅是单次访问std::bitset
没有bool
数组快。 -
常数较大的一些 STL 容器:
std::stack/std::queue/std::deque/std::list/std::valarray/std::string...
,这些东西能手写尽量手写。 -
std::multiset
的count()
函数的复杂度为 (O(log n + ans)),因此多多考虑用std::map
实现std::multiset
的功能。 -
直接对
std::set/std::multiset/std::map/std::multimap
进行<algorithm>
库中的二分查找的复杂度为 (O(n)),正解应该用其自带的lower_bound()/upper_bound()
函数,复杂度为 (O(log n))。 -
善用 STL 中函数的特性(比如返回值)可以提升一些效率,示例:用
std::set
过5e6
。 -
std::priority_queue
默认为大根堆,小根堆可以取负、重载运算符或std::greater
。 -
std::multimap
不支持[]
下标访问。 -
在使用
std::vector
时可以尝试用reserve()
预测数组的大小以提高效率。实测push_back()
次数较多时reserve()
后能快一倍。 -
许多 STL 容器都特化了
swap()
函数,可以实现 (O(1)) 交换。 -
std::bitset
重载了流运算符,即可以用cin/cout
输入输出。当然也可以用这个输出整数的二进制。 -
std::nth_element
会改变元素在容器中的位置。 -
对
std::vector
等序列容器进行下标访问是最好将size()
函数的返回值转为int
。一个成功避免大问题的一个例子:for (int i = (int)v.size() - 2; i >= 0; i--) v[i] += v[i + 1]
。 -
使用
std::map<Key, Value>
的[]
下标访问方法是,如果无对应Key
元素的话会新建一个,值为调用构造函数Value()
的结果。 -
STL 容器进行修改操作时需要注意迭代器被非法化的情况,被非法化的迭代器不能再使用。如使用
std::set
的erase(it)
后it
就被非法化了。std::vector
等也需要注意这种问题。各种容器增删操作非法化情况表。