通用的(泛型)演算法 generic algorithm 總覽 特性: 1,標準庫的順序容器定義了很少的操作,比如添加,刪除等。 2,問題:其實還有很多操作,比如排序,查找特定的元素,替換或刪除一個特定值等,但是標準庫並未給每個容器都定義成員函數來實現這些操作。 3,解決辦法:因為演算法是相同的邏輯,只 ...
通用的(泛型)演算法 generic algorithm 總覽
特性:
1,標準庫的順序容器定義了很少的操作,比如添加,刪除等。
2,問題:其實還有很多操作,比如排序,查找特定的元素,替換或刪除一個特定值等,但是標準庫並未給每個容器都定義成員函數來實現這些操作。
3,解決辦法:因為演算法是相同的邏輯,只是進行運算的元素的類型是不同的。所以定義了一組與類型無關的通用的(泛型)演算法:generic algorithm。它們實現了實現了上述標準庫未提供的操作。
4,好處:不用為每個容器實現上述的操作。
大多數演算法都定義在頭文件algorithm中,數值相關的演算法定義在頭文件numeric中。
關鍵概念:演算法永遠不會執行容器的操作。
通用演算法本身不會執行容器的操作,它們只會運行於迭代器之上,執行迭代器的操作。演算法永遠不會改變底層容器的大小。演算法可能改變容器中保存的元素的值,也可能在容器內移動元素,但永遠不會直接添加或刪除元素。
以find演算法為例,find函數可以接受任意類型的容器
#include <iostream>
#include <vector>
#include <algorithm>
#include <list>
using namespace std;
int main(){
//find vector<int>
/*
int val = 121;
vector<int> ivec{1,2,3,12,34};
vector<int>::const_iterator result = find(ivec.cbegin(), ivec.cend(),
val);
cout << *result << endl;
*/
//find list<string>
/*
string s("aaa");
list<string> li{"ddd","aaa1","aaa","dds"};
list<string>::const_iterator result =
find(li.cbegin(), li.cend(), s);
cout << *result << endl;
*/
//find 內置數組
int val = 22;
int ar[] = {1,22,33,4};
int* result = find(begin(ar), end(ar), val);
cout << *result << endl;
auto res1 = find(ar, ar + 4, val);
cout << *res1 << endl;
}