Effective STL學習筆記 條款43

2021-08-12 00:06:06 字數 1523 閱讀 9873

每個演算法接受至少一對用來指示將被操作的物件區間的迭代器。比如,min_element可以找出此區間中的最小的值,而accumulate則對區間內的元素作某種形式的整體求和運算(參見條款37),partition將區間內的元素分割為滿足和不滿足某判決條件的兩個部分(參見條款31)。當演算法被執行時,它們必須檢查指示給它的區間中的每個元素,並且是按你所期望的方式進行的:從區間的起始點循還到結束點。有一些演算法,比如find和find_if,可能在遍歷完成前就返回了,但即使是這些演算法,內部都包含乙個迴圈。畢竟,即使是find和find_if也必須在檢視過了每個元素後,才能斷定它們所尋找的元素在不在此區間內。

使用演算法可以代替我們大部分的迴圈工作,例如你有乙個widget的容器,想要對每個widget呼叫重繪:

class widget

void print()

;vector

vw =

;//其實基於範圍的for迴圈**以及比迭代器和原始的for迴圈**優雅很多了

for(auto& widget : vw)

但是我們確實可以使用演算法幫助我們減少一部分工作,例如for_each:

std::for_each(vw.begin(), vw.end(), mem_fn(&widget::print));

//列印輸出如下

print widget :1

print widget :2

print widget :3

事實上,本條款將證明呼叫演算法通常比手寫的迴圈更優越。

為什麼?有三個理由:

● 效率:演算法通常比程式設計師產生的迴圈更高效。

● 正確性:寫迴圈時比呼叫演算法更容易產生錯誤。

● 可維護性:演算法通常使**比相應的顯式迴圈更乾淨、更直觀

你可能會這麼做(或者使用迭代器)

vector

vnums = ;

deque

dnums;

for(auto value : vnums)

但是使用演算法我們可以這麼做:

//1.

std::transform(vnums.begin(), vnums.end(), std::inserter(dnums, dnums.begin()), std::bind(std::plus(), _1, 100));

//2.

std::transform(vnums.begin(), vnums.end(), std::inserter(dnums, dnums.begin()), (int l)

);

我們可以基於不同的類似於std::plus(),做更多的擴充套件。

使用stl容器的c++精緻程式中的迴圈比不使用stl的等價程式少多了。這是好事。只要能用高層次的術語——如insert、find和for_each,取代了低層次的詞彙——如for、while和do,我們就提公升了軟體的抽象層次,並因此使得它更容易實現、文件化、增強和維護。

Effective STL學習筆記 條款20

在這裡我們強調的是指標,先個例子 set ssp ssp.insert new ssp.insert new string lemon ssp.insert new string banana ssp.insert new string pear for auto str ssp 按照我們正常的想法...

Effective STL學習筆記 條款23

直接進入主題,為什麼會考慮使用vector代替關聯容器呢,可能有這樣的場景,一對關聯的資料,而時使用時要求資料查詢速度很快。當然我們必須知道有序的vector的缺點就是他必須保持有序,乙個新item插入可能造成其他元素的移動。所以這種場景可能在幾乎不插入和刪除時考慮。乙個例子 using pair ...

Effective STL學習筆記 條款30

看個例子 我們使用transform函式給乙個容器承載計算結果 vector src 待計算的資料 vector res 計算結果 src.push back 0 src.push back 1 src.push back 2 src.push back 3 std transform src.be...