1. 程式人生 > 實用技巧 >ACM小工具

ACM小工具

1.unique

unique函式的函式原型如下:

只有兩個引數,且引數型別都是迭代器:

1 iterator unique(iterator it_1,iterator it_2);

這種型別的unique函式是我們最常用的形式。其中這兩個引數表示對容器中[it_1,it_2)範圍的元素進行去重(注:區間是前閉後開,即不包含it_2所指的元素),返回值是一個迭代器,它指向的是去重後容器中不重複序列的最後一個元素的下一個元素

2.C++ merge和inplace_merge(STL merge和inplace_merge

merge() 演算法會合並兩個序列並將結果儲存到第三個序列中,它使用 < 運算子來比較元素。圖 1 表明合併操作被運用到 these 和 those 容器的內容上,結果序列儲存在 both 容器中。


merge() 演算法需要 5 個引數。其中前兩個指定第一個輸入序列的迭代器,在這個示例中是 these,後面兩個迭代器指定第二個輸入序列,在這個示例中是 those,最後一個引數是一個指定合併元素存放位置的迭代器,即 both 容器。用來指定輸入序列的迭代器只需要是最低層次的迭代器,用來儲存合併結果的迭代器需要是一個輸出迭代器。

merge() 演算法並沒有關於被合併序列容器的資訊,所以它們不能建立元素,只能用提供的作為第 5 個引數的迭代器來儲存元素。因而在這個示例中,目的序列中的元素必須是已經存在的。在圖 1 中,通過以兩個輸入容器元素個數之和為指定的元素個數建立一個 both 容器來保證此要求。建立的結果序列可以放在任何位置,甚至可以放在一個源序列容器中,但源序列和目的序列不能重疊;如果它們重疊了,結果是未定義的,但可以肯定的是效果肯定不好。當然,可以用一個插入迭代器來指定目的位置,元素會被自動建立。

merge() 演算法返回的迭代器指向合併序列末尾的後一個位置,所以可以通過這個函式呼叫使用的第 5 個引數加上這個函式返回的迭代器來確定合併序列的範圍。

inplace_merge演算法

inplace_merge() 演算法可以合併同一個序列中兩個連續有序的元素序列。它有三個引數: first、second、last 和 last 是一個雙向迭代器。這個序列中的第一個輸入序列是 [first,second), 第二個輸入序列是 [second,last),因而 second 指向的元素在第二個輸入序列中。結果為 [first, last)。圖 2 展示了這個操作。