演算法和函數對象

來源:互聯網
上載者:User

一 演算法。

在演算法描述中,模板參數的名稱很重要。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.......

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.