c++中常用的泛型算法


    std中定義了很好幾種順序容器,它們自身也提供了一些操作,但是還有很多算法,容器本身沒有提供。 而在algorithm頭文件中,提供了許多算法,適用了大多數順序容器。與c++11相比,很多函數在 c++17與c++20又改變了很多,下面內容基於c++11去簡單介紹.

參考文獻: https://en.cppreference.comhttps://zh.cppreference.com, 大家直接去這里看吧。。我就是拿的這里的!!!

 

    介紹之前,首先說明兩點:

  • 關於泛型算法,必須明白一點:它們只會通過容器的迭代器來完成相關的操作,不會使用容器相關的任何操作。它意味着這些算法無論進行什么樣的操作,容器的大小不會改變。
  • 泛型算法相關的函數中,經常需要傳入謂詞(predicate)參數。謂詞指的是可調用的對象,返回bool類型,例如:函數名、函數指針、lambda函數、重載了operator()的類對象等。包含一個參數的謂詞稱為一元謂詞(unary predicate), 包含兩個參數的謂詞稱為二元謂詞(binary predicate)。

 

1. 只遍歷容器而不修改容器元素的算法:

a. 判斷給定的容器是否滿足給定條件

 

all_of(iter1_, iter2_, unaryPredicate_)         // 返回bool類型,如果容器內的所有元素, 對一元謂詞為true,則返回true;
any_of(iter1_, iter2_, unaryPredicate_)         // 返回bool類型,如果容器任何一個元素, 對一元謂詞為true,則返回true;
none_of(iter1_, iter2_, unaryPredicate_)       // 返回bool類型,如果容器內沒有一個元素,對一元謂詞為true,則返回true; (與all_of()正好相反)

b. 查找容器中滿足條件的元素(如果不給定謂詞參數,則會使用opretor==)
find(iter1_,iter2_, value)               // 返回迭代器,它指向第一個等於value的元素。
find_if(iter1_,iter2_, unary_predicate_)         // 返回迭代器,它指向第一個使一元謂詞為true的元素。
find_if_not(iter1_, iter2_, unary_predicate_)      // 返回迭代器,它指向第一個使一元謂詞為false的元素。
find_first_of(iter1, iter2, iter11, iter22, binaryPredicate_) // 返回迭代器, 在[iter1,iter2)中查找在[iter11,iter22)出現的任意一個元素, 返回第一個滿足條件的元素的迭代器。
find_end(iter1, iter2, iter11, iter22, binaryPredicate_)  // 返回迭代器, 在 [iter1, iter2)中查找子序列[iter11, iter22), 返回滿足條件的最后一個序列的起始元素。
fadjacent_find(iter1, iter2, binarayPredicate_)     // 返回迭代器, 在[iter1, iter2)中查找相鄰的元素滿足條件的;

c. 查找容器中滿足條件元素的數目
cout(iter1, iter2, value)               // 返回滿足條件的數目
cout_if(iter1, iter2, unaryPredidate_)          // 返回使一元謂詞為true的數目

d. 對容器內的每一個元素執行相同的操作
for_each(iter1_, iter2_, unaryFunction_)       // 返回unaryFunction_, 該返回值對一般的函數或函數指針用處不大,對函數對象可能會有用;
                         // 作用:對指定范圍內的所有元素依次執行一元函數操作.
for_each_n(iter1, n, unaryFunction_)         // 返回迭代器,指向n個元素的下一個元素, 功能類似.(在c++17中開始有)

 

從這里到最后的截圖圖片來自:https://zh.cppreference.com/w/cpp/algorithm, 發現這樣有現成的,真的賴得寫了啊。

 2. 修改序列的操作

 

 

3. 排序操作

 

4. 二分搜索操作

 

5.集合操作

 

6. 最大最小操作

 

另外,還有一些操作,不經常用,大家去推薦的網站看吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM