一 演算法。
在演算法描述中,模板參數的名稱很重要。In、Out、For、Bi、Ran分別表示輸入,輸出,前向,雙向和隨即訪問迭代器。Pred表示一元謂詞,BinPred表示二元謂詞,Cmp表示比較操作,Op表示一元操作,BinOp表示二元操作。如果傳遞一個為提供所需操作的 類型,就將在模板執行個體化的時候產生一個錯誤。
二 函數對象 謂詞 約束器 適配器 否定器
2.1謂詞綜述,
在<functional>裡,標準庫提供了一些常用謂詞:
equal_to, not_equal_to m,greater,less,greater_equal,less_equal,logical_and,logical_or,logical_not.
2.2 約束器 適配器 和否定器
這些適配器具有統一的結構,他們都依賴於函數對象基類 unary_function 和binary_function。
三 非修改性序列演算法。
1 比較常見的 for_each
template <class In, class Op>Op for_each(In first,In last, Op f)<br />{<br /> while(first != last)<br />f(*first++);<br /> return f;<br />}
2 尋找 find find_if. find()可以看成find_if的一個==作為謂詞的版本。
3 計數.count ,count_if.
4 equal, mismatch().
5 search() , search_n(), find_end()... 這個find_end()相當於反向的search(),但是為什麼用find的名字呢。
四 修改性序列演算法。
藉助迭代器的操作都不能改變容器的大小,除了無法插入或刪除元素以外,這些演算法可以修改元素的值,交換元素,複製元素等。
甚至remove的操作也是通過腹瀉掉一些元素的的方式完成的。
1 copy
2 transform
string nameof(const string &str){ return str;}<br />void testtran()<br />{<br /> list<string> ls;<br /> ls.push_back("1");<br /> ls.push_back("2");<br /> ls.push_back("3");<br /> transform(ls.begin(),ls.end(),ostream_iterator<string>(cout),nameof);<br />}
3 unique.
unique()並不重複資料刪除的元素,他不過是把不重複的元素移向序列的前部(頭部),返回指向這段
無重複子序列末端的迭代器。
// TEMPLATE FUNCTION unique WITH PRED<br />template<class _FwdIt,<br />class _Pr> inline<br />_FwdIt _Unique(_FwdIt _First, _FwdIt _Last, _Pr _Pred)<br />{// remove each satisfying _Pred with previous<br />if (_First != _Last)<br />for (_FwdIt _Firstb; (_Firstb = _First), ++_First != _Last; )<br />if (_Pred(*_Firstb, *_First))<br />{// copy down<br />for (; ++_First != _Last; )<br />if (!_Pred(*_Firstb, *_First))<br />*++_Firstb = _Move(*_First);<br />return (++_Firstb);<br />}<br />return (_Last);<br />}</p><p>//或者精簡如下<br />template<class For> For unique(For first,For last)<br />{<br /> first = adjacent_find(first,last);<br /> return unique_copy(first,last,first);<br />}
unique其實只刪除了相鄰是重複的。為了清除所有的重複的,輸入序列首先先排序,然後再如此。應該確認在排序和重複資料刪除時使用的是同一個準則。
4 replace replace_copy.
template<class In,class Out,class T>
Out replace_copy(In first,In last,Out res,const T& val,const T& new_val)
{
while(first != last)
{
*rest++ = (*first == val)?new_val:*first;
++first;
}
}
5 remove remove_copy remove_copy_if
6 fill generate. fill 不過是generate的一個特殊情況,其中的函數反覆給出同樣的值。
7 reverse rotate random_shuffle ..and so on.
四 排序。
1 sort()演算法需要隨機訪問迭代器。他們最好用在vector中。
stable_sort能保持其相對順序的不改變,而sort則不行。
partial_sort.
nth_element.
2 二分檢索。binary_search()
3 merge inplace_merge.
4 劃分。partition.
5 序列上的集合運算。
確保這些容器都是已排序的。
includes() set_union set_intersection set_difference set_symmetric_difference
10 排列。
對於元素的順序,每種組合都是一種排列。
可以擷取排列的演算法: next_permutation prev_permutation.
continue tomorrow.......