1. 程式人生 > 實用技巧 >實用但可能鮮為人知的 C++ STL 整理(持續收集中…)

實用但可能鮮為人知的 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>