c 泛型演算法

2021-08-14 22:51:31 字數 2696 閱讀 9172

泛型演算法都定義在標頭檔案algorithm中,演算法並不直接操作容器,而是遍歷由兩個迭代器指定的乙個元素範圍。

find操作的是迭代器,因此我們可以用同樣的find函式在任何容器中查詢值

vector

a = ;

int val = 3;

auto result = find(a.begin(), a.end(), val);

cout

<< "the value "

<< val << (result == a.cend() ? " is not present" : " is present") << endl;

只會讀取其輸入範圍內的元素,而不會改變元素。

vector

a = ;

int val = 3;

auto result = find(a.begin(), a.end(), val);

cout

<< accumulate(a.begin(), a.end(), 0);

拼接

vector

vec = ;

cout

<< accumulate(vec.begin(), vec.end(), string(""));

用於確定兩個序列是否儲存相同的值,可以用於比較兩個不同型別的容器中的元素

給定這個值賦予輸入序列中的每個元素

vector

vec = ;

fill(vec.begin(), vec.end(), "");

fill_n

fill_n(vec.begin(),vec.size(),0); //將所有元素重置為0
接受乙個指向容器的引用,是一種插入迭代器,一種向容器中新增元素的迭代器

vector

vec; //空向量

auto it = back_inserter(vec);

*it = 42; //vec中現在有乙個元素42

fill_n(it, 10, 0); //再新增10個為0的元素

接受三個迭代器,前兩個表示拷貝源範圍,第三個表示拷貝目的起始位置

int a1 = ;

int a2[sizeof(a1) / sizeof(*a1)];

auto ret = copy(begin(a1), end(a1), a2);//把a1內容拷貝到a2

replace(begin(a2), end(a2), 0, 42);
sort函式會重排輸入序列中的元素,使之有序。

消除重複單詞

//消除重複單詞

void elimdups(vector

&words)

自定義比較函式

// 比較函式,用來按長度排序單詞

bool isshorter(const

string &s1, const

string &s2)

sort(words.begin(), words.end(), isshorter);

乙個lambda表示式表示乙個可呼叫的**單元,我們可以將其理解為乙個未命名的內聯函式,乙個lambda表示式具有乙個返回型別、乙個引數列表和乙個函式體

auto f =  ;  //  忽略引數列表的lambda表示式

cout

<< f();

auto sortlambda=(const

string &a, const

string &b) //帶引數表示式

;sort(words.begin(), words.end(), sortlambda);

//捕獲的lambda

int sz=4;

auto findstring = [sz](const

string &a) ;

auto count = find_if(words.begin(), words.end(), findstring); //返回乙個迭代器,指向第乙個長度不小於sz的元素

for_each(count, words.end(), (const

string &s) );

可變lambda

加上mutable關鍵字

void fcn3()

; v1 = 0;

auto j = f(); //執行後j等於43

}void fcn3()

; v1 = 0;

auto j = f(); //執行後j等於1

}

bool check_size(const

string &s, string::size_type sz)

auto check = bind(check_size, _1, 5);

auto count = find_if(words.begin(), words.end(), check);

C 泛型演算法

標準庫並未給每個容器都定義成員函式來實現這些操作,而是定義了一組泛型演算法,稱他們為演算法是因為他們實現了一些經典演算法的公共介面,如排序和搜尋 稱他們為排序的是因為它們可以用於不同型別的元素和多種容器型別。大多數演算法都定義在標頭檔案algorithm中。標準庫還在標頭檔案numeric中定義了一...

C 泛型演算法

1 泛型演算法初始 標準庫演算法都是對乙個範圍內的元素進行操作 除了少數例外 並將此範圍稱為 輸入範圍 而且總是使用前兩個引數來表示次範圍,這兩個引數分別代表,要處理的首元素和尾元素之後位置的迭代器。1.1 唯讀演算法 只會讀取輸入範圍內的元素,而從不改變元素 find int sum accumu...

C 泛型演算法

1 泛型演算法定義 泛型演算法 因為它們實現共同的操作,所以稱之為 演算法 而 泛型 指的是它們可以操作在多種容器型別上 不但可作用於 vector 或 list 這些標準 庫型別,還可用在內建陣列型別 甚至其他型別的序列上,這些我們將在本章的 後續內容中了解。自定義的容器型別只要與標準庫相容,同樣...