標籤:

在oi/acm中,有什麼冷門但好用的stl函數?

例如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::rotate

std::equal_range

std::binary_search

std::merge

std::nth_element

std::replace_copy

std::for_each


"冷門"這個詞不太好定義啊……

隨便寫幾個

min_element

max_element

next_permutation

valarray

sstream

make_heap / pop_heap / push_heap

以下c++11

iota

regex

is_sorted

還有stl中所有的swap全都是O(1)的,可以理解為只交換了容器的指針


  1. #include &

    可以包含常用的
    algorithm, iostream, vector 等,無需繁瑣地逐個include.

  2. 除了 @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 哪個比較適合寫演算法?

TAG:C | OI | ACM競賽 |