C++日記——Day58:STL算法概述、內部處理、使用範例

算法概述

可以理解爲函數模板。比如:查找、排序等,有數十上百個算法,前兩個參數一般都是迭代器類型,表示容器中的元素的一個區間

 

調用方式:算法名(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);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章