欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++容器算法示例詳解

 更新時間:2024年08月28日 08:55:52   作者:solicit  
在談到容器算法,我們大概率會用到謂詞predicate,謂詞返回的類型是布爾類型(bool)可以是lambda表達式、函數(shù)對象以及其它可調(diào)用的對象,這篇文章主要介紹了C++容器算法,需要的朋友可以參考下

容器算法

<algorithm>c++自帶的容器算法,提供一系列實用的算法。在談到容器算法,我們大概率會用到謂詞predicate,謂詞返回的類型是布爾類型(bool)可以是lambda表達式、函數(shù)對象以及其它可調(diào)用的對象。

查找

find()查找元素

find接受三個參數(shù),第三個參數(shù)是值類型,set、map自帶count函數(shù)也能實現(xiàn)這樣的功能,返回值0表示不存在。為了方便本次連帶find_if、find_if_not、find_first_offind_endadjacent_find一起舉例。

vector<int> a{1, 1, 2, 3, 4, 4, 5};
vector<int> b{5, 6, 6};
find(a.begin(), a.end(), 3); // 返回的是迭代器,未查找到返回a.end()
find_if(a.begin(), a.end(), [](auto x){return x != 3;}); //接受一個一元謂詞,找到第一個滿足條件的元素
find_if_not(a.begin(), a.end(), [](auto x){return x != 3;}); //接受一個一元謂詞,找到第一個不滿足條件的元素
// find_first_of找到存在于第一個范圍的第二個范圍中的第一個元素(可能并不是第二個范圍第一個元素)返回迭代器,也支持一個二元謂詞。
vector<int> a{1, 1, 2, 3, 4, 4, 5};
vector<int> b{6, 5, 6};
auto it = find_first_of(a.begin(), a.end(), b.begin(), b.end());
cout << *it << endl; // 返回5
// find_end找到最后一個匹配子序列的位置,返回最后一個子序列開始的迭代器,也支持一個二元謂詞
vector<int> a{1, 1, 2, 3, 1, 4, 1, 2};
vector<int> b{1, 2};
auto it = find_end(a.begin(), a.end(), b.begin(), b.end());
cout << distance(a.begin(), it) << endl; // 6指向第7個元素
// adjcent_find找到兩個值鄰近的元素,返回指向找到的第一個元素的迭代器,接受一個二元謂詞
vector<int> a{1, 1, 2, 3, 4, 1, 2};
vector<int> b{1, 2};
auto it = adjacent_find(a.begin(), a.end());
auto it = adjacent_find(a.begin(), a.end(), 
    [](auto a, auto b)->bool{return  a + b = 10;});
cout << *it << endl;

去重

unique(nums.begin(), nums.end())除掉連續(xù)相同的值

unique函數(shù)的作用是刪除掉的連續(xù)的相同的值,unique還支持傳入二元謂詞(可以理解為一個參數(shù)的函數(shù)),會返回一個迭代器it,但是并不是end(),中間是未指定的值(訪問可能會產(chǎn)生未定義行為)。注意不要用setmap,返回的都是常量迭代器是無法改變的,即其指向的元素無法改變。

// 無謂詞寫法
vector<int> a{1, 1, 2, 3, 4, 4, 5};
auto it = unique(a.begin(), a.end()); // 此時a為{1, 2, 3, 4, 5}
for_each(a.begin(), a.end(), [](auto it){cout << it << endl;}); // 輸出為{1, 2, 3, 4, 5, 4, 5}
for_each(a.begin(), it, [](auto it){cout << it << endl;}); // 輸出為{1, 2, 3, 4, 5}
// 有二元謂詞
vector<int> a{1, 1, 2, 3, 4, 4, 5};
auto it = unique(a.begin(), 
    a.end(), [](auto a, auto b) -> bool{return  a != b;}); // 此時a為{1, 2, 3, 4, 5},lambda表達式作為一個二元謂詞,每次從數(shù)組中取兩個嚴肅進行判斷,然后刪除不相等的元素。
for_each(a.begin(), a.end(), [](auto it) -> int{cout << it << endl;}); // Error,這是因為unique將返回的迭代器到之后的end()迭代器指向的值刪除了,但是空間還在。此時訪問,會發(fā)生未定義行為。
for_each(a.begin(), it, [](auto xs){cout << xs << endl;}); // 1,1
cout << distance(a.begin(), a.end()) << endl; // 7,distance求算距離是7

unique_copy()除掉連續(xù)相同的值并復(fù)制到目標容器

注意,使用此函數(shù)之前先分配空間,再使用unique_copy并不進行內(nèi)存分配,只是賦值給另一個容器,如果訪問未賦值部分的容器區(qū)域,那么會產(chǎn)生未定義行為。同樣,也支持二元謂詞,通過二元謂詞判定移除連續(xù)值。

vector<int> a{1, 1, 2, 3, 4, 4, 5};
vector<int> b(7, 0);
auto it = unique_copy(a.begin(), a.end(), b.begin());
for_each(b.begin(), it, [](auto xs){cout << xs << endl;}); // out: 1 2 3 4 5
// 二元謂詞, 一般不要使用二元謂詞與數(shù)字直接進行比較,可以使用remove實現(xiàn)
auto it = unique_copy(a.begin(),
    a.end(), b.begin(), [x](auto a, auto b)
    -> bool{return a == 3;});
for_each(b.begin(), it, [](auto xs){cout << xs << endl;}); // out: 1 1 2 3,解釋值等于3才會進行unique_copy
auto it = unique_copy(a.begin(),
    a.end(), b.begin(), [x](auto a, auto b)
    -> bool{return a == b;});
for_each(b.begin(), it, [](auto xs){cout << xs << endl;}); // out: 1 2 3 4 5,解釋a = b,才會進行復(fù)制

排序

sort()對容器進行排序

sort用于實現(xiàn)容器元素的排序,sort也同樣接受二元謂詞

sort(a.begin(), a.end());
sort(a.begin(), a.end(), greater<>()); // 使用庫中自帶的greater\less對象

迭代器差值

distance()求迭代之間距離

distance用于求算兩個迭代器之間的差值,只用于同一容器, set,mapvector都可以用。

distance(c.begin(), c.end());

遍歷容器

for_each()for_each_n遍歷容器每個元素并執(zhí)行函數(shù)規(guī)定的操作,第三個參數(shù)是一個函數(shù)。如果要對迭代器指向的元素修改,那么set就是不可以的,因為set返回的是常量迭代器。

array<int, 5> a{1, 2, 3, 4, 5};
for_each(a.begin(), a.end(), [](int& x){cout<< x; x *= 2;}); // 此時元素值會發(fā)生改變,因為捕獲的是引用。
for_each(a.begin(), a.end(), [](auto x) -> void{x *= 2; cout << x;}); // 此時元素值不會發(fā)生改變,捕獲的是值,會變?yōu)楦北尽?
for_each_n(a.begin, 5, [](auto x) -> void{x *= 2; cout << x;}); // 第二個參數(shù)指定操作的數(shù)量n, 對n個元素進行操作。

復(fù)制元素

copy()能夠?qū)⑷萜髦械脑貜?fù)制到輸出迭代器之后out iterator

vector<vector<int>> sx(1);
// 建議復(fù)制前先分配多個空間,避免不必要的擴容
copy(sx.begin(), sx.end() , sx.begin()); // 可以將[begin, end)之間的元素復(fù)制到從begin()開始的位置。這種操作會將原先的元素覆蓋一次
// 一個有意思的做法是使用back_inserter指明要進行尾插法,某些支持雙向插入的容器也可以轉(zhuǎn)變未尾插容器,省去了一些需要選擇插入函數(shù)的麻煩。
// set、map類紅黑樹容器不存在后插方法,無法進行此類調(diào)用,注意
copy(sx.begin(), sx.end() , back_inserter(sx)); // 負值時會在末尾插入元素
vector<int> a{1, 2, 3};
set<int> s;
copy(a.begin(), a.end() , back_inserter(s)); // Error
// 接下來我們考慮一個向vector<vector<int>>復(fù)制的問題
vector<vector<int>> v(1); // 此時外部vector容量為1,size也是1。說明內(nèi)部存在一個vector容器元素,但是此時vector[0]的size和capacity都是0,是一個空容器。
copy(v.begin(), v.end(), back_inserter(v)); // 此時內(nèi)部空容器是2個

copy_backward()能夠?qū)⑷萜髦性貜?fù)制到輸出迭代器之前。

map、set類也不支持。這個容器算法會覆蓋掉輸出迭代器之前的元素

vector<int> a{1, 2, 3, 4, 5, 6};
set<int> s;
copy_backward(a.begin(), a.end() , s); // Error
copy_backward(a.begin(), a.begin() + 3, a.end()); // OK a{1, 2, 3, 1, 2, 3}
copy_backward(a.begin(), a.begin() + 3, a.begin()); // OK,但是數(shù)組不會發(fā)生任何改變,相當于復(fù)制到begin()迭代器之前沒有意義。

全排列

next_permutation提供返回容器的一個全排列,也支持一個二元謂詞。

next_permutation(a.begin(), a.end());

取集合

set_intersection取交集、set_union取并集、set_difference取單側(cè)差集,set_symmetric_difference取兩側(cè)差集,值得注意的是set_difference在輸出到結(jié)果容器中只會輸出第一個容器中的元素(不管第一個容器的元素是否少于第二個容器的元素)。這四個函數(shù)都接受一個二元謂詞。注意:mapset都無法使用,因為這三個函數(shù)底層實現(xiàn)都需要用到自增運算符,而map和set只有常量迭代器不支持這樣的操作。應(yīng)用場景:vector等容器。

vector<int> a{1, 2, 2, 6, 7, 9};
vector<int> b{1, 2, 5, 8, 10};
vector<int> interResult;
vector<int> unionResult;
vector<int> differenceResult;
vector<int> symmetricResult;
set_intersection(a.begin(), a.end(),b.begin(), b.end(), back_inserter(interResult));
set_union(a.begin(), a.end(),b.begin(), b.end(), back_inserter(unionResult));
set_difference(a.begin(), a.end(),b.begin(), b.end(), back_inserter(differenceResult));
set_symmetric_difference(a.begin(), a.end(),b.begin(), b.end(), back_inserter(symmetricResult));
cout << "intersection:" <<endl;
for_each(interResult.begin(), interResult.end(), [](auto& item){cout << item << ":";});
cout << endl;
cout << "differencesection:" <<endl;
for_each(differenceResult.begin(), differenceResult.end(), [](auto& item){cout << item << ":";});
cout << endl;
cout << "unionsection:" <<endl;
for_each(unionResult.begin(), unionResult.end(), [](auto& item){cout << item << ":";});
cout << endl;
cout << "symmetric_diff_section:" <<endl;
for_each(symmetricDifferenceResult.begin(), symmetricDifferenceResult.end(), [](auto& item){cout << item << ":";});
/* output
* intersection:
* 1:2:
* differencesection:
* 2:6:7:9:
* unionsection:
* 1:2:2:5:6:7:8:9:10:
* symmetric_diff_section: 
* 2:6:7:9:5:8:10 */

搜索

search搜索串中的子序列,search_n搜索串中固定數(shù)量的連續(xù)重復(fù)值。search_n接受一個二元謂詞,兩個函數(shù)都能夠使用setmap。search接受一個searcher可調(diào)用對象,但是search_n對于set是沒有意義的,因為set中不存在重復(fù)值

vector<int> a{1,1,1,4};
vector<int> b{1,2};
auto it = search(a.begin(), a.end(),b.begin(), b.end());
auto xs = search_n(a.begin(), a.end(), 3, 1);
int ret = it == a.end()? -1 : 1;
int res = xs == a.end()? -1 : 1;
cout << ret <<endl; // -1; 未找到
cout << res << endl; // 1; 找到了{1,1,1}

到此這篇關(guān)于C++容器算法的文章就介紹到這了,更多相關(guān)C++容器算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c++模擬實現(xiàn)string類詳情

    c++模擬實現(xiàn)string類詳情

    這篇文章主要介紹了c++模擬實現(xiàn)string類詳情,string表示可變長的字符序列,使用string類型必須首先包含string頭文件。作為標準庫的一部分,string定義在命名空間std中,下面進入文章一起看看詳細內(nèi)容吧
    2022-01-01
  • Qt實現(xiàn)對齊線功能的示例代碼

    Qt實現(xiàn)對齊線功能的示例代碼

    這篇文章主要介紹了Qt如何實現(xiàn)對齊線功能,并且可以添加任意數(shù)量和自動吸附,文中示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-06-06
  • C++多線程強制終止詳細

    C++多線程強制終止詳細

    這篇文章主要介紹了C++多線程強制終止, 實際上,沒有任何語言或操作系統(tǒng)可以為你提供異步突然終止線程的便利,且不會警告你不要使用它們。但是下面我們再來簡單看看相關(guān)內(nèi)容吧
    2021-09-09
  • C++使用回溯法解決黃金礦工問題

    C++使用回溯法解決黃金礦工問題

    在矩陣中考察回溯算法,分為任意起點、左上角開始等情況。從而有不同的模板,其實區(qū)別就是直接開始還是每個坐標都去嘗試,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-10-10
  • C語言使用單鏈表實現(xiàn)學(xué)生信息管理系統(tǒng)

    C語言使用單鏈表實現(xiàn)學(xué)生信息管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言使用單鏈表實現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C語言超詳細講解函數(shù)指針的運用

    C語言超詳細講解函數(shù)指針的運用

    函數(shù)指針是一個指針變量,它可以存儲函數(shù)的地址,然后使用函數(shù)指針,下面這篇文章主要給大家介紹了關(guān)于C語言進階教程之函數(shù)指針的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • 數(shù)據(jù)結(jié)構(gòu)之數(shù)組Array實例詳解

    數(shù)據(jù)結(jié)構(gòu)之數(shù)組Array實例詳解

    這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之數(shù)組Array實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Qt6.0開發(fā)環(huán)境搭建步驟(圖文)

    Qt6.0開發(fā)環(huán)境搭建步驟(圖文)

    這篇文章主要介紹了Qt6.0開發(fā)環(huán)境搭建步驟(圖文),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C++結(jié)合OpenCV實現(xiàn)RRT算法(路徑規(guī)劃算法)

    C++結(jié)合OpenCV實現(xiàn)RRT算法(路徑規(guī)劃算法)

    這篇文章主要介紹了C++結(jié)合OpenCV實現(xiàn)RRT算法,RRT算法整體框架主要分為rand、near、new三點的建立和near與new之間的安全性檢查,需要的朋友可以參考下
    2022-05-05
  • C語言實現(xiàn)簡易通訊錄功能

    C語言實現(xiàn)簡易通訊錄功能

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡易通訊錄功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06

最新評論