實用但可能鮮為人知的 C++ STL 整理(持續收集中…)
收錄了一些較為實用的 STL,並進行了簡單描述,供大佬們參考。一些顯然廣為人知的如
sort
就不放了。如果發現有錯誤,歡迎在評論區指出。
同時歡迎各位進行新增。
assert (expr);
assert
是一個巨集,當表示式 expr
的值為 0
時,程式會被終止(RE),然後你會得到一個訊息,包含這個表示式的內容,表示式所在行號及原始檔名:Assertion failed: expression, file filename, line line number
常用於:除錯。標頭檔案:<cassert>
。
nth_element(first, nth, last);
重新排列區間 [first, last)
,使得位置 nth
的值等於該區間排序後該位置的值。即,執行後 [first, nth)
中所有元素的值小於等於 nth
,(nth, last)
中所有元素的值大於等於 nth
。可以在最後加上比較函式 comp
。期望複雜度為線性。
常用於:K-D Tree 的建樹。標頭檔案:<algorithm>
。
merge(first1, last1, first2, last2, result);
合併兩個已經排好序的區間 [first1, last1), [first2, last2)
至 result
(新區間將 result
作為首迭代器),並返回合併後的尾迭代器。合併後新區間仍然有序。可以在最後加上比較函式 comp
[result, 返回值)
於兩個區間相交可能會出錯。時空複雜度線性。
常用於:歸併排序,分治。標頭檔案:<algorithm>
。
inplace_merge(first, middle, last);
合併兩個相鄰的有序區間 [first1, last1), [first2, last2)
至 [first, last)
。效果與 merge
函式類似。可以在最後加上比較函式 comp
。若有可以額外使用的記憶體,那麼時空複雜度為線性;反之空間消耗為常數,但時間為線性對數複雜度。
常用於:歸併排序,分治。標頭檔案:<algorithm>
。
accumulate(first, last, init, op);
在 init
的基礎上,對區間 [first,last)
以 op
的運算方式進行累計。引數 op
沒有時則預設為 +
運算子。複雜度線性。
常用於:偷懶。標頭檔案:<numeric>
。
iota(first, last, val);
對區間 [first, last)
賦值,從 first
開始,每次將 val
賦值為當前位置,然後執行 ++val
。複雜度線性。
常用於:偷懶。標頭檔案:<numeric>
。
partial_sum(first, last, result);
對區間 [first, last)
計算字首和,結果存入 result
。當然也可以在引數後加上 op
,代替加法做字首運算。複雜度線性。
常用於:偷懶。標頭檔案:<numeric>
。
prev(it, n = 1);
返回迭代器 it
向前 n
(預設為 1
)個單位的結果。如果是隨機訪問迭代器那麼會直接使用 -
運算子,複雜度為常數;
否則使用 n
次 --
運算子,複雜度線性。
常用於:偷懶。標頭檔案:<iterator>
。
next(it, n = 1);
返回迭代器 it
向後 n
(預設為 1
)個單位的結果。如果是隨機訪問迭代器那麼會直接使用 +
運算子,複雜度為常數;
否則使用 n
次 ++
運算子,複雜度線性。
常用於:偷懶。標頭檔案:<iterator>
。