算法概述
可以理解爲函數模板。比如:查找、排序等,有數十上百個算法,前兩個參數一般都是迭代器類型,表示容器中的元素的一個區間
調用方式:算法名(iterbg,itered)傳遞進去的應該是前閉後開的區間 [ begin() , end() ] ;
好處:
a、如果第一個形參等於第二個形參,也就是 iterbg == itered, 那麼就表示是個空區間;
b、迭代時,算法判斷迭代器只要等於最後變這個開區間,那麼就表示迭代結束;
算法:一種搭配迭代器使用的全局函數;算法跟具體容器沒關聯,只跟迭代器有關聯;只需要根據迭代器來開發算法,不需要理會具體容器。這種方式更加靈活,但是也缺失了直觀性;某些數據結構和算法之間的兼容性也不那麼好
算法的一些內部處理
算法會根據傳遞進來的迭代器來分析出迭代器的種類,不同種類的迭代器,算法會有不同的處理,要編寫不同的代碼來應對;
這種辨析不同代碼來處理不同種類迭代器,能夠直接影響到算法的執行效率;
這也是STL內部爲什麼要做一個分類的目的;
一些算法使用範例
算法頭文件要包含進來:#include <algorithm>
1、for_each()
void myfunc(int i){
cout << i << endl;
}
vector<int> myvec{ 10, 20, 30, 40 };
for_each(myvec.begin(), myvec.end(), myfunc); //myfunc是一個可調用對象
2、find()
vector<int> myvec{ 10, 20, 30, 40 };
vector<int> finder = find(myvec.begin(), myvec.end(), 40); //myfunc是一個可調用對象
if (finder != myvec.end()){ //判斷是否等於find的第二個參數,等於就沒找到,不等於就找到了
cout << "find it" << endl;
}
當成員函數和全局函數同時存在時,優先考慮使用同名的成員函數,如果沒有成員函數在考慮使用全局函數。
map<int, string> mymap;
mymap.push_back(2, "li");
mymap.push_back(1, "bai");
auto finder = mymap.find(2);
if (finder != mymap.end()){
printf("id:%d, name:%s", iter->first, iter->second.c_str());
}
3、find_if()
auto result = find_if(myvec.begin(), myvec.end(), [](int val)
{
if (val > 15){
return true;
}
return false;
}
);
if (result == myvec.end()){
cout << "not find" << endl;
}
else{
cout << "find it" << endl;
}
4、sort()
vector<int> myvec = { 50, 15, 80, 30};
sort(myvec.begin(), myvec.end()); //缺省參數時按照從小到大排列
可以自定義排序
bool func(int i, int j){
return i < j; //從小到大排序
}
bool func(int i, int j){
return i < j; //從大到小排序
}
sort(myvec.begin(), myvec.end(), func);