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

C++使用sort對(duì)容器排序的實(shí)現(xiàn)

 更新時(shí)間:2021年05月21日 10:32:24   作者:范中豪  
C++ STL 標(biāo)準(zhǔn)庫(kù)中的sort()函數(shù)專門用來(lái)對(duì)容器或普通數(shù)組中指定范圍內(nèi)的元素進(jìn)行排序,本文就詳細(xì)的介紹一下怎么實(shí)現(xiàn),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

本文主要解決以下問(wèn)題

  • STL中sort的使用方法
  • 使用sort對(duì)vector的排序
  • 使用sort對(duì)map排序
  • 使用sort對(duì)list排序

STL中sort的使用方法

C++ STL 標(biāo)準(zhǔn)庫(kù)中的 sort() 函數(shù),本質(zhì)就是一個(gè)模板函數(shù)。該函數(shù)專門用來(lái)對(duì)容器或普通數(shù)組中指定范圍內(nèi)的元素進(jìn)行排序,排序規(guī)則默認(rèn)以元素值的大小做升序排序,除此之外我們也可以選擇標(biāo)準(zhǔn)庫(kù)提供的其它排序規(guī)則(比如std::greater降序排序規(guī)則),甚至還可以自定義排序規(guī)則。

值得一提的是,sort() 函數(shù)位于頭文件中,因此在使用該函數(shù)前,程序中應(yīng)包含如下語(yǔ)句:

#include <algorithm>

sort() 函數(shù)有 2 種用法,其語(yǔ)法格式分別為:

//對(duì) [first, last) 區(qū)域內(nèi)的元素做默認(rèn)的升序排序
void sort (RandomAccessIterator first, RandomAccessIterator last);
//按照指定的 comp 排序規(guī)則,對(duì) [first, last) 區(qū)域內(nèi)的元素進(jìn)行排序
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

其中,first 和 last 都為隨機(jī)訪問(wèn)迭代器,它們的組合 [first, last) 用來(lái)指定要排序的目標(biāo)區(qū)域;另外在第 2 種格式中,comp 可以是 C++ STL 標(biāo)準(zhǔn)庫(kù)提供的排序規(guī)則(比如 std::greater),也可以是自定義的排序規(guī)則。

數(shù)組排序樣例:

#include <algorithm>
#include <algorithm>

using namespace std;

int main(){
    int arr[] = {2,6,3,5,4,8,1,0,9,10};
    sort(arr, arr+10);
    for(int i = 0;i < 10;i++)
        cout << arr[i] << " ";
}
// out
/*
0 1 2 3 4 5 6 8 9 10
*/

使用 STL 標(biāo)準(zhǔn)庫(kù)提供的排序規(guī)則

int main(){
    int arr[] = {2,6,3,5,4,8,1,0,9,10};
    sort(arr, arr+10, std::greater<int>());
    for(int i = 0;i < 10;i++)
        cout << arr[i] << " ";
    cout << endl;
    sort(arr, arr+10, std::less<int>());
    for(int i = 0;i < 10;i++)
        cout << arr[i] << " ";
}
// out
/*
10 9 8 6 5 4 3 2 1 0
0 1 2 3 4 5 6 8 9 10
*/

使用自定義比較器

bool cmp(const int a, const int b){
    return a < b;
}
int main(){
    int arr[] = {2,6,3,5,4,8,1,0,9,10};
    sort(arr, arr+10, cmp);
    for(int i = 0;i < 10;i++)
        cout << arr[i] << " ";
}
// out
/*
0 1 2 3 4 5 6 8 9 10
*/

使用 lambda 表達(dá)式自定義比較器

int main(){
    int arr[] = {2,6,3,5,4,8,1,0,9,10};
    sort(arr, arr+10, [](const int a, const int b){
         return a < b;
         });
    for(int i = 0;i < 10;i++)
        cout << arr[i] << " ";
}
// out
/*
0 1 2 3 4 5 6 8 9 10
*/

使用sort對(duì)vector的排序

在 C++ 中幾乎操作vector時(shí),幾乎可以視作是在操作數(shù)組,可以將vector看作對(duì)數(shù)組的封裝。因此,使用sort對(duì)vector進(jìn)行排序時(shí)完全可以遵循上面使用sort對(duì)數(shù)組的排序方法。

一維vector排序

int main(){
    vector<int> vec = {2,6,3,5,4,8,1,0,9,10};
    sort(vec.begin(), vec.end());
    for(int item: vec)
        cout << item << " ";
    return 0;
}
// out
/*
0 1 2 3 4 5 6 8 9 10
*/

二維vector排序。數(shù)組保存一系列的坐標(biāo),先按照第二維進(jìn)行升序排列,再按照第一維升序排列

int main(){
    vector<vector<int>> vvi = {{9,1}, {2,3}, {8,7}, {6,2}, {5,2}};

    sort(vvi.begin(), vvi.end(), [](const vector<int>& v1, const vector<int>& v2){
         if(v1[1] < v2[1]) return true;
         else if(v1[1] == v2[1]) return v1[0] < v2[0];
         else return false;
         });

    for(vector<int> v: vvi){
        for(int item: v){
            cout << item << " ";
        }
        cout << endl;
    }

    return 0;
}
// out
/*
9 1
5 2
6 2
2 3
8 7
*/

使用sort對(duì)map排序

map是用來(lái)存放<key, value>鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu),可以很方便快速的根據(jù)key查到相應(yīng)的value,map本身的實(shí)現(xiàn)方式內(nèi)含了比較器的設(shè)置,只要我們?cè)趍ap初始化的時(shí)候傳入比較器,即可完成對(duì)應(yīng)的排序。

定義包含水果及其個(gè)數(shù)的map,按照水果名稱字典序進(jìn)行排序 (按key排序)

#include<map>

using namespace std;

int main(){
    map<string, int, less<string>> msi;
    msi["apple"] = 5;
    msi["watermelon"] = 2;
    msi["pear"] = 3;
    msi["peach"] = 6;
    msi["cherry"] = 10;

    for(auto item: msi)
        cout << item.first << " " << item.second << endl;

    return 0;
}
// out
/*
apple 5
cherry 10
peach 6
pear 3
watermelon 2
*/

定義包含水果及其個(gè)數(shù)的map,按照水果個(gè)數(shù)進(jìn)行排序,當(dāng)水果個(gè)數(shù)相同時(shí),按照水果名稱字典序排序 (將map轉(zhuǎn)為vector進(jìn)行排序)

bool cmp(const pair<string, int>& a, const pair<string, int>& b){
    if(a.second < b.second) return true;
    else if(a.second == b.second) return a.first < b.first;
    else return false;
}
int main(){
    map<string, int> msi;
    msi["apple"] = 5;
    msi["watermelon"] = 2;
    msi["pear"] = 3;
    msi["peach"] = 5;
    msi["cherry"] = 10;

    vector<pair<string, int>> vpi(msi.begin(), msi.end());
    sort(vpi.begin(), vpi.end(), cmp);

    for(auto item: vpi){
        cout << item.first << " " << item.second << endl;
    }

    return 0;
}
// out
/*
watermelon 2
pear 3
apple 5
peach 5
cherry 10
*/

使用sort對(duì)list排序

sort() 函數(shù)模板定義在頭文件 algorithm 中,要求使用隨機(jī)訪問(wèn)迭代器。但 list 容器并不提供隨機(jī)訪問(wèn)迭代器,只提供雙向迭代器,因此不能對(duì) list 中的元素使用 sort() 算法。但是,還是可以進(jìn)行元素排序,因?yàn)?list 模板定義了自己的 sort() 函數(shù)。sort() 有兩個(gè)版本:無(wú)參 sort() 函數(shù)將所有元素升序排列。第二個(gè)版本的 sort() 接受一個(gè)函數(shù)對(duì)象或 lambda 表達(dá)式作為參數(shù),這兩種參數(shù)都定義一個(gè)斷言用來(lái)比較兩個(gè)元素。

list排序示例

int main(){
    list<string> ls = {"one", "two", "three"};
    ls.sort([](const string& a, const string& b){
                return a < b;
            });
    for(string item: ls) cout << item << " ";

    return 0;
}
// out
/*
one three two
*/

參考文獻(xiàn)

C++中SORT函數(shù)使用方法

C++ sort()排序函數(shù)用法詳解

C++ Lambda表達(dá)式詳解

STL-map的簡(jiǎn)單用法

C++ STL中Map的按Key排序和按Value排序

C++ list(STL list)排序及合并元素方法詳解

到此這篇關(guān)于C++使用sort對(duì)容器排序的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C++ sort對(duì)容器排序 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言類型轉(zhuǎn)換與常量的細(xì)節(jié)深入理解探究

    C語(yǔ)言類型轉(zhuǎn)換與常量的細(xì)節(jié)深入理解探究

    這篇文章主要為大家介紹了C?語(yǔ)言類型轉(zhuǎn)換與常量的細(xì)節(jié)深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • C語(yǔ)言之預(yù)處理命令的深入講解

    C語(yǔ)言之預(yù)處理命令的深入講解

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言之預(yù)處理命令的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • C語(yǔ)言數(shù)組和指針,內(nèi)存之間的關(guān)系

    C語(yǔ)言數(shù)組和指針,內(nèi)存之間的關(guān)系

    這篇文章主要介紹了C語(yǔ)言數(shù)組和指針,內(nèi)存之間的關(guān)系,首先論證一維數(shù)組和一級(jí)指針之前的關(guān)系,我們常常使用一級(jí)指針指針的方式訪問(wèn)一維數(shù)組,只有對(duì)內(nèi)存的理解到位才能理解它們直接的關(guān)系。需要的小伙伴可以參考一下
    2022-02-02
  • C++?pthread入門指南

    C++?pthread入門指南

    pthread是C++98接口且只支持Linux,使用時(shí)需要包含頭文件#include?<pthread.h>,編譯時(shí)需要鏈接pthread庫(kù),其中p是POSIX的縮寫(xiě),而POSIX是Portable?Operating?System?Interface的縮寫(xiě),這篇文章主要介紹了C++?pthread簡(jiǎn)介,需要的朋友可以參考下
    2024-05-05
  • C語(yǔ)言中((type *)0) 和(type *0)區(qū)別小結(jié)

    C語(yǔ)言中((type *)0) 和(type *0)區(qū)別小結(jié)

    ((type *)0)?和?(type *0)?在 C 和 C++ 中有不同的含義和用途,本文主要介紹了C語(yǔ)言中((type *)0) 和(type *0)區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-08-08
  • C語(yǔ)言怎樣用指針指向字符串

    C語(yǔ)言怎樣用指針指向字符串

    這篇文章主要介紹了C語(yǔ)言怎樣用指針指向字符串問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • opencv+arduino實(shí)現(xiàn)物體點(diǎn)追蹤效果

    opencv+arduino實(shí)現(xiàn)物體點(diǎn)追蹤效果

    這篇文章主要為大家詳細(xì)介紹了opencv+arduino實(shí)現(xiàn)物體點(diǎn)追蹤效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++可變參數(shù)的函數(shù)與模板實(shí)例分析

    C++可變參數(shù)的函數(shù)與模板實(shí)例分析

    這篇文章主要介紹了C++可變參數(shù)的函數(shù)與模板,非常重要的概念,需要的朋友可以參考下
    2014-08-08
  • C語(yǔ)言求向量和的兩則問(wèn)題解答分享

    C語(yǔ)言求向量和的兩則問(wèn)題解答分享

    這篇文章主要介紹了C語(yǔ)言求向量和的兩則問(wèn)題解答分享,分別是求連續(xù)子向量的最大和和任何連續(xù)最接近0的子向量的和的問(wèn)題,需要的朋友可以參考下
    2016-04-04
  • VSCode 配置C++開(kāi)發(fā)環(huán)境的方法步驟

    VSCode 配置C++開(kāi)發(fā)環(huán)境的方法步驟

    這篇文章主要介紹了VSCode 配置C++開(kāi)發(fā)環(huán)境的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03

最新評(píng)論