1. 程式人生 > >C++_演算法_非修改性序列演算法

C++_演算法_非修改性序列演算法

for_each演算法

for_each(iterator begin, iterator end, proc op);

說明:for_each演算法實現對區間[begin, end]中每個元素均呼叫程序op。

元素計數演算法

count(iterator begin, iterator end, const T& value);
count_if(iterator begin, iterator end, unarypredicate op);

說明:函式count將統計在迭代器區間[begin, end]範圍之內等於value的元素個數;函式count_if只有當op引數為真時,才統計元素的個數。

最小值和最大值演算法

iterator min_element(iterator begin, iterator end);
iterator max_element(iterator begin, iterator end);
iterator min_element(iterator begin, iterator end, compfunc op);
iterator min_element(iterator begin, iterator end, compfunc op);

說明:上述兩種形式的函式,第一種形式是以“operator<”進行元素比較;第二種形式中引數op用來比較兩個元素op(ele1, ele2)。如果第一個元素小於第二個元素,應當返回true,如果存在多個最大值或最小值,返回找到的第一個。

搜尋演算法
a.搜尋第一個匹配元素

iterator find(iterator begin, iterator end, const T& value);
iterator find_if(iterator begin, iterator end, unarypredicate op);

說明:第一種形式函式返回區間[begin, end]中第一個“元素值等於value”的元素的位置;第二種形式函式返回在區間[begin, end]中滿足條件op(ele)的第一個元素。如果函式搜尋失敗,返回值為end。

b.搜尋前n個連續匹配值

iterator search_n(iterator begin, iterator end, size count, const T& value);
iterator search_n(iterator begin, iterator end, size count, const T& value, binarypredicate op);

說明:第一個函式返回區間[begin, end]中的第一組“連續count個元素值全等於value”的元素位置;第二個函式返回區間[begin, end]中第一組滿足條件op為“真”的“連續count個元素”。如果搜尋失敗,函式返回值為end。

c.搜尋第一個子區間

iterator search(iterator1 begin, iterator1 end, iterator2 searchbegin, iterator2 searchend);
iterator search(iterator1 begin, iterator1 end, iterator2 searchbegin, iterator2 searchend, binarypredicate op);

說明:這兩個函式都返回和區間[searchbegin, searchend]完全吻合的第一個子區間的第一個元素位置。第二個函式只有在op為“真”時才被執行。如果搜尋失敗,兩個函式均返回end。

d.搜尋最後一個子區間

iterator find_end(iterator1 begin, iterator1 end, iterator2 searchbegin, iterator2 searchend);
iterator find_end(iterator1 begin, iterator1 end, iterator2 searchbegin, iterator2 searchend, binarypredicate op);

說明:這一組函式都返回區間[begin, end]之中“和區間[searchbegin, searchend]完全吻合”的最後一個子區間內的第一個元素位置。其中,第二個函式只有在條件表示式op為“真”時才有意義。如果函式搜尋失敗,返回end。

e.搜尋某些元素的第一次出現位置

iterator find_first_of(iterator1 begin, iterator1 end, iterator2 searchbegin, iterator2 searchend);
iterator find_first_of(iterator1 begin, iterator1 end, iterator2 searchbegin, iterator2 searchend, binarypredicate op);

說明:這兩個函式都返回“子串[searchbegin, searchend]”在區間[begin, end]中出現的第一個元素的位置;第二個函式執行時要滿足條件表示式op為“真”,才有意義。

f.搜尋兩個連續相等的元素

template<class T> T adjacent_find(T first, T last);
template<class T, class pred> T adjacent_find(T first, T last, pred pr);

說明:上述兩種形式的函式宣告形式,第一種形式返回在區間[first, last]中第一對“連續相等兩個元素”之中的第一個元素的位置;第二種形式返回區間[first, last]中第一對“連續兩個元素均使二元判斷式pr為true”其中的第一個元素。第二種形式本質還是屬於有條件搜尋,搜尋符合條件pr的兩個連續元素,並返回第一個元素的位置。

區間比較演算法

template<class init1, class init2>bool equal(init1 first, init1 last, init2 x);
template<class init1, class init2, class pred>bool equal(init1 first, init1 last, init2 x, pred pr);
template<class init1, class init2>pair<init1, init2> mismatch(init1 first, init1 last, init2 x);
template<class init1, class init2, class pred>pair<init1, init2> mismatch(init1 first, init1 last, init2 x, pred pr);
template<class init1, class init2>bool lexicographical_compare(init1 first1, init1 last1, init2 first2, init2 last2);
template<class init1, class init2, class pred>bool lexicographical_compare(init1 first1, init1 last1, init2 first2, init2 last2, pred pr);

說明:函式equal()可以實現兩個容器的比較,如果兩個物件相等,函式返回true。該函式只能比較屬於同一型別的不同變數;函式mismatch()用於尋找兩個容器物件之間兩兩相異的對應元素,如果沒有找到相異點,並不意味著這兩個物件完全相同,因為這兩個物件的容量不一定相同。如果沒有找到相異點,函式返回值是一個pair,以第一個物件的end元素和第二個物件的相應元素組成;函式 lexicographical_compare()屬於字典式比較,類似於C語言中的函式strcmp()。