国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

C++STL之常見算法

開發 前端
STL是數據容器與算法的高度組合,今天我們通過一些常用的例子來學習一下STL中的常用算法。

STL算法基本都是通過模板的方式實現的,只是為我們提供一個統一的算法模型,有點像JS中鴨子模型,在這個模型中具體實現什么樣的功能是由我們通過函數對象或回調函數的方式來實現的。

下面我們通過一些常用的例子來學習一下STL中的常用算法...

遍歷

對于STL中的容器遍歷問題,平時我們用得最多的就是auto for循環遍歷,其實對于容器的遍歷,STL中還給我提供了另外一個函數std::for_each。 這個函數特別適合哪些需要在遍歷的過程中對每個元素進行復雜操作的場景。

int main() {
    std::vector<int> vec;
    for (int i = 0; i < 10; ++i) {
        vec.emplace_back(i);
    }
    std::for_each(vec.begin(), vec.end(), [](const int &value){
        std::cout << "value:" << value << std::endl;
    });
    return 0;
}

當然,如果你不喜歡使用lambda表達式,也可以使用回調函數的寫法:

void myFun(const int &val){
    std::cout << "value:" << val << std::endl;
}
int main() {
    std::vector<int> vec;
    for (int i = 0; i < 10; ++i) {
        vec.emplace_back(i);
    }
    std::for_each(vec.begin(), vec.end(), myFun);
    return 0;
}

排序

在STL中最常用的排序應該就是std::sort,它默認是升序排序,如果需要實現降序排序可以通過修改std::sort的第三個參數實現:

int main() {
    std::vector<int> vec{2, 1, 5, 9, 4,0};
    // 默認升序排序
//    std::sort(vec.begin(),vec.end());
    // 改成降序排序
    std::sort(vec.begin(),vec.end(),std::greater<int>());
    std::for_each(vec.begin(),vec.end(),[](const int &va){
        std::cout << "va:" << va << std::endl;
    });
    return 0;
}

在STL中排序還可以使用函數std::stable_sort實現,那么為什么會有兩個排序函數呢?std::stable_sort和std::sort的區別是什么呢?

這里就要提一下std::sort的穩定性了,在C++標準中,std::sort并不保證穩定性。這意味著當容器中存在有相同鍵值的元素時,經過std::sort排序后,相等元素的相對位置可能會改變。換句話說,相同鍵值的元素在排序后可能會改變原來的相對順序。 而std::stable_sort則是可以保證排序的穩定性的,因此如果有穩定性需求的話可以使用std::stable_sort代替std::sort。

查找

在標準庫中我們可以通過函數std::find實現查找。std::find需要確保容器類型對待查詢的值類型有合適的比較操作符(通常是operator==),如果是自定義類型,可能需要重載operator==來定義相等性比較。

int main() {
    std::vector<int> vec{1,3,5,7,9};
    auto pos = std::find(vec.begin(),vec.end(),1);
    if(pos != vec.end()){
        std::cout << "找到匹配的" << std::endl;
    } else{
        std::cout << "沒有找到匹配的" << std::endl;
    }
    return 0;
}

另外我們還可以使用函數find_if實現條件查找:

int main() {
    std::vector<int> vec{1,3,5,7,9,9,9};
    // 查找是否有9的元素
    auto result = std::find_if(vec.begin(),vec.end(),[](const int val){
        return val == 9;
    });
    return 0;
}

假如我們想找出一個容器中的最大值或者最小值,可以嘗試下使用max_element和min_element

int main() {
    std::vector<int> vec{1,3,5,7,9,9,9};
    auto max = std::max_element(vec.begin(),vec.end());
    auto min = std::min_element(vec.begin(),vec.end());
    std::cout << "max:" << *max << std::endl;
    std::cout << "min:" << *min << std::endl;
    return 0;
}

統計

對于容器中某個元素個數的統計,我們可以使用count和count_if實現,它們的用法和上面的std::find和find_if用法一個,帶if的是按照條件統計。

int main() {
    std::vector<int> vec{1,3,5,7,9,9,9};
    auto result = std::count(vec.begin(),vec.end(),9);
    std::cout << "個數:" << result << std::endl;
    result = std::count_if(vec.begin(),vec.end(),[](const int &val){
        return val == 2;
    });
    std::cout << "個數:" << result << std::endl;
    return 0;
}

刪除

對于容器元素的刪除,大部分使用容器內部的刪除函數即可,一般是erase,但是針對std::list也可以使用內部的remove函數進行刪除。 一般我們遵循以下幾條原則就行:

  • 如果容器是vector、string或deque,使用erase-remove慣用法。
// 所有為9的元素都會被刪除
int main() {
    std::vector<int> vec{9,3,5,7,9,2,9};
    vec.erase(std::remove(vec.begin(),vec.end(),9),vec.end());
    for (const auto val:vec) {
        std::cout << "val:" << val << std::endl;
    }
    return 0;
}
  • 如果容器是list,使用list.remove
  • 如果容器是標準關聯容器,使用它的erase成員函數即可。

變換

假如這么一個需求,需要將std::string中的字符全部變為大寫,你會怎么寫呢?此時std::transform就很適合你。

std::transform它用于對一個迭代器內的元素進行轉換操作,并將結果存儲在另一個迭代器中。

std::transform有兩個重載方法,一個是對應于一元操作,一個是對應于二元操作。

我們先來看看一元操作:

int main() {
    std::string s("Hello");
    std::transform(s.begin(),s.end(),s.begin(),[](unsigned char c) { return std::toupper(c); });
    std::cout << s << std::endl;
    return 0;
}

上述代碼的意思就是遍歷字符串變量s,將其字符變為大寫,然后重新保存在變量s中。

下面我們再來看看std::transform的二元操作:

int main() {
    // 注意兩個容器的size并不一定相等
    std::vector<int> input1 = {1, 2, 3, 4, 5,10};
    std::vector<int> input2 = {5, 4, 3, 2, 1};
    std::vector<int> output;
    // resize 開辟足夠的空間
    output.resize(input1.size());
    // 對input1和input2中對應位置的元素進行相加操作,并將結果存儲到output
    std::transform(input1.begin(), input1.end(), input2.begin(), output.begin(), std::plus<int>());
    // 輸出結果
    for (const auto& value : output) {
        std::cout << value << " ";
    }
    return 0;
}

上面代碼的意思是將容器input1的變量和容器input2的變量逐個相加,然后輸出到目標容器output中。其中std::plus就是數相加的模板。最終的輸出結果是:

6 6 6 6 6 10

需要注意的一點是輸出目標容器必須提前開辟足夠的空間,否則可能會無法正常完成轉換。因此上面實例代碼中的output.resize(input1.size());是很有必要的。

集合計算

所謂集合計算,一般是針對多個容器而言的。

例如我們要求兩個容器之間的交集,則可以使用set_intersection,求并集則使用set_union,求差集則使用set_difference。

int main() {
    std::vector<int> vec1{1,3,5,7,9};
    std::vector<int> vec2{1,2,3,6,8};
    std::vector<int> out;
    // 分配足夠的空間
    out.resize(vec1.size() + vec2.size());
     // vec1中有的,vec2也有的
//    auto end = std::set_intersection(vec1.begin(),vec1.end(),vec2.begin(),vec2.end(),out.begin());
//    std::for_each(out.begin(),end,[](const int &val){
//       std::cout << "交集:" << val << std::endl;
//    });

     // vec1中有的,而vec2沒有的
//    auto end = std::set_difference(vec1.begin(),vec1.end(),vec2.begin(),vec2.end(),out.begin());
//    std::for_each(out.begin(),end,[](const int &val){
//        std::cout << "差集:" << val << std::endl;
//    });

    // vec1和vec2去重后的合并結合
    auto end = std::set_union(vec1.begin(),vec1.end(),vec2.begin(),vec2.end(),out.begin());
    std::for_each(out.begin(),end,[](const int &val){
        std::cout << "并集:" << val << std::endl;
    });

    return 0;
}

平時在寫代碼的過程中,如果我們需要用到一個算法,盡量不要自己寫,首先要看看STL是否已經有寫好的算法模型,如果有的話我們直接使用STL中的即可,因為STL中的算法基本都是 集思廣益,結合了很多精華的結果,我們個人寫的很難在性能上與之媲美。

責任編輯:趙寧寧 來源: 思想覺悟
相關推薦

2011-07-13 14:28:09

STL算法

2020-12-10 11:21:00

編程C ++程序員

2011-07-14 17:45:06

CC++

2011-07-13 13:56:06

STL迭代器

2011-07-13 15:07:48

STLC++

2009-08-11 09:19:52

C#選擇排序C#算法

2024-10-24 08:04:00

2011-07-20 13:57:06

C++STL

2011-07-13 14:49:31

STLC++

2011-07-20 13:57:06

C++STL

2011-07-20 14:12:48

2023-11-21 16:13:38

C++代碼

2024-05-17 13:27:45

頭文件C++開發

2024-04-19 13:02:27

容器C++

2023-12-10 22:00:47

STLC++編程

2009-08-11 14:43:42

C#數據結構與算法

2009-08-11 14:51:11

C#數據結構與算法

2017-11-22 14:20:07

前端JavaScript排序算法

2022-05-17 12:23:25

排序算法面試

2014-07-29 11:35:34

點贊
收藏

51CTO技術棧公眾號

久久福利一区二区| 日本wwww视频| 国产成人天天5g影院在线观看| 国产午夜久久av| 国产精品免费丝袜| 欧美不卡视频一区发布| 搡女人真爽免费午夜网站| 成人台湾亚洲精品一区二区| 国产日产亚洲精品系列| 97在线观看免费高清| 日本高清久久天堂| 日韩欧美国产精品一区二区三区| 天天躁日日躁狠狠躁欧美| 欧美日韩国产一区二区| 国内精品一区二区| 亚洲最大网站| 国产mv日韩mv欧美| 欧美一区二区色| 在线看免费av| 国产99久久精品| 国产成人综合亚洲| 欧美性videos| 99久久精品免费| 成人啪啪免费看| 日本午夜大片a在线观看| 国产精品欧美久久久久一区二区| 国产精品爽爽爽| 国产99re66在线视频| 久久中文字幕电影| 91在线视频一区| 在线观看网站免费入口在线观看国内 | 一本色道久久综合亚洲精品高清| 日韩综合在线视频| 亚洲三级免费看| 在线看黄网站| 国产传媒一区在线| 国产精品海角社区在线观看| av中文字幕在线观看第一页| 夜夜精品浪潮av一区二区三区| 色视频一区二区三区| 亚洲妇女av| 国产一区二区三区免费视频| 黄色一级视频网站| 国产美女在线精品| 国产欧美一区二区三区视频| 欧美亚洲综合视频| 欧美精品国产精品| 国产一级大片| 国产毛片精品国产一区二区三区| 成人黄色片在线| 视频二区欧美毛片免费观看| 日韩视频一区二区三区在线播放| 成人高清免费| 成人美女在线视频| 欧美日韩最好看的视频| 亚洲精品aaaaa| 亚洲四色影视在线观看| av在线日韩国产精品| 亚洲精品免费在线观看| 熟女少妇在线视频播放| 奇米精品一区二区三区四区| 亚洲最大的网站| 日韩无套无码精品| 精品在线播放免费| 国产日韩欧美二区| 国产一区二区三区四区五区传媒| 中文字幕av日韩| 爱看av在线入口| 制服视频三区第一页精品| 天堂v视频永久在线播放| 亚洲激情中文1区| 激情五月开心婷婷| 久久影音资源网| 黄色一级视频在线播放| 国产精品一区二区在线观看网站| 少妇免费毛片久久久久久久久| 精品成人久久| 国产传媒一区二区| 综合久久综合| 99中文字幕| 国产精品婷婷| 久久99导航| 国产精品日本| 久久综合九九| 国内精品国产三级国产a久久| 91在线视频导航| 欧美黄页免费| 久久久精品综合| 久久99国产精品一区| 久久人人97超碰com| 中文字幕在线第一页| 亚洲免费综合| 亚洲精品在线免费看| 国产精品久线观看视频| 日本中文字幕在线视频| 26uuu久久噜噜噜噜| 午夜在线播放视频欧美| 国产日韩欧美久久| 国产亚洲精品久久久| 欧美片第1页综合| 97国产精东麻豆人妻电影 | 99在线观看免费视频精品观看| 黄色一级片播放| 91精品国产一区二区人妖| 老司机凹凸av亚洲导航| 日产精品高清视频免费| 亚洲激情成人在线| 国产91亚洲精品久久久| 国产精品一区二区三区观看| 国产精品美女久久久久久久久久久| caoporn国产精品免费视频| 精品中文字幕在线观看| 美国三级日本三级久久99| 黄网站app在线观看大全免费视频| 国产午夜精品视频| 亚洲人成免费| 5566中文字幕一区二区电影| 欧美日韩视频免费观看| 亚洲自拍中文字幕| 猫咪成人在线观看| 精品国偷自产国产一区| 女优一区二区三区| 99热亚洲精品| 欧美一级理论片| 久久久久亚洲| 黄色三级电影网| 一区二区三区无码高清视频| 亚洲免费影院| 在线中文字幕av| 中文国产亚洲喷潮| 亚洲精品国产日韩| 一区二区三区高清在线视频 | 精品欧美国产一区二区三区| 先锋影音网一区二区| 特级毛片在线免费观看| 欧美中文字幕一区二区三区| 精品久久久亚洲| 国产精品区在线| 亚洲欧美另类人妖| 国产精品分类| 中文字幕在线网| 欧美野外猛男的大粗鳮| 波多野洁衣一区| a天堂资源在线| 成人av免费在线看| 亚洲男同1069视频| 四虎影视精品永久在线观看| 亚洲v欧美v另类v综合v日韩v| 精品成人在线视频| 国产中文精品久高清在线不| 国产传媒在线视频| 91在线观看免费| 大荫蒂欧美视频另类xxxx| 99国产精品一区二区| 95影院理论片在线观看| 欧美美女15p| 一区二区在线免费观看| 日韩精品四区| 在线免费观看的av网站| 国产精品久久一区主播| 国产91露脸合集magnet| 日韩av资源| 久久综合久久久| 一区二区三区精品99久久| 亚洲欧美怡红院| 在线电影一区| 欧美成人精品三级网站| 任你操这里只有精品| 91久久精品久久国产性色也91| 欧美久久久久久久久中文字幕| 国产69精品久久777的优势| 国产精品亚洲二区| 国产黄色免费在线观看| 亚洲国产婷婷香蕉久久久久久99| 欧美大胆在线视频| 午夜精品一区二区三区免费视频| 欧美日韩精品| 素人啪啪色综合| 独立日3在线观看完整版| 国产精品老牛影院在线观看| 婷婷国产在线综合| 国产综合成人久久大片91| 一区二区中文字幕在线观看| 每日更新在线观看av| 五月天男人天堂| 久久久亚洲国产天美传媒修理工| 欧美日韩国产一区中文午夜| 视频一区二区不卡| 免费看成人人体视频| 青青免费在线视频| 亚洲欧洲久久| 久久久久久国产免费| 欧美性猛交xxx| 国产成人精品1024| 日本一区二区高清不卡| 欧美bbbxxxxx| 国产欧美高清在线| 国产噜噜噜噜久久久久久久久| 精品国产一区久久| 亚洲国产经典视频|