在oi/acm中,有什麼冷門但好用的stl函數?
01-08
例如pb_ds庫中的配對堆優化dijkstra這些有用但不是很常見的?
__builtin 函數
(似乎有點偏題,不算 STL)__builtin_popcount:二進位中 1 的個數
__builtin_ctz:末尾的 0,即對 lowbit 取log__builtin_clz:開頭的 0,用 31 減可以得到下取整的 log
複雜度都是 O(1),有些常數會有點大。如果是 long long,函數名末尾加 ll,31 改成 63。std::rotatestd::equal_rangestd::binary_searchstd::mergestd::nth_elementstd::replace_copystd::for_each
"冷門"這個詞不太好定義啊……
隨便寫幾個min_elementmax_elementnext_permutationvalarraysstreammake_heap / pop_heap / push_heap以下c++11
iotaregex
is_sorted還有stl中所有的swap全都是O(1)的,可以理解為只交換了容器的指針#include &
可以包含常用的
algorithm, iostream, vector 等,無需繁瑣地逐個include.- 除了 @Immortals 提到的幾個隱藏的函數外,再舉兩個
__gcd(a, b)
求兩個數的最大公約數.
__builtin_ffs(x)
舉例: __builtin_ffs(10) = 2,因為二進位10表示為 "1010" 從右往左數,第一個1的下標為1(下標從0開始計數),函數返回 1+index,所以結果為2;而如果 x== 0, 則 return 0;
ostream_iterator istream_iterator:cin cout 也是 iterator 哦
lower_bound upper_bound:自帶二分
generate_n:輸入數據的時候好使啊copy_n:複製整數直接 memcpy 就行了,但是別忘了這個還能從輸入複製/複製到輸出vector&<&>::swap:這個是 O(1) 的numeric_limits:別再問 long long 十進位多少位了,自己查random_shuffle打亂一個序列,隨機化神器上次我看uoj上有一個人用這個加卡時硬卡了50分,而且那個題還是捆綁測試的QAQ另外不資瓷rope,好像常數很大的樣子
next_permutation算嗎。。輪子書的附錄貌似列了很多STL函數,也有好多算是「冷門但好用」吧。
accumulate可以指定求和求積什麼的count可以數特定元素的個數啥的會lambda彷彿打開了新世界的大門
正向迭代器反向迭代器之間的轉換函數。 用好map 與set有時候可以省下很多代碼量。 矩陣快速冪並不一定需要自己去實現。 也可以調庫, 怎麼用忘記了 。__gcd(x,y)也可以直接用,不需要自己寫, 雖然自己寫也就一行。
推薦閱讀:
※如何向完全不懂編程的小夥伴解釋「程序寫死」?
※為什麼 C++ 只比 VBA 快 4倍?
※正在學c++但是越學越覺得自己還有好多東西不知道?
※為什麼現代CFD和PIC模擬大量採用C++編寫?針對這些模擬C++相對於C的優勢在哪?
※C、C++、MATLAB、Python、Go 哪個比較適合寫演算法?