最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++?sort()與stable_sort()使用指北(附示例代碼)

 更新時(shí)間:2025年12月22日 10:35:18   作者:hellokandy  
這篇文章主要介紹了C++?sort()與stable_sort()使用的相關(guān)資料,std::sort()和std::stable_sort()都是C++標(biāo)準(zhǔn)庫(kù)中的排序算法,文中通過(guò)代碼將用法介紹的非常詳細(xì),需要的朋友可以參考下

在 C++ 標(biāo)準(zhǔn)庫(kù)中,std::sort() 和 std::stable_sort() 都用于對(duì)容器中的元素進(jìn)行排序,但二者最根本的區(qū)別在于穩(wěn)定性。

1、排序的穩(wěn)定性是個(gè)什么玩意

如果兩個(gè)元素相等(比較結(jié)果為等價(jià)),排序后它們的相對(duì)順序與原序列中保持一致。

2、到底誰(shuí)更穩(wěn)定

  • std::sort() 是不穩(wěn)定的排序算法,意味著相等元素的相對(duì)順序在排序后可能被改變。
  • std::stable_sort() 是穩(wěn)定排序,保證相等元素的原始輸入順序在排序后保持不變。

3、它們內(nèi)部的實(shí)現(xiàn)方式

  • std::sort() 通常采用Introsort(內(nèi)省排序),結(jié)合快速排序、堆排序和插入排序,平均性能極佳。
  • std::stable_sort() 多基于歸并排序(Merge Sort),因其天然具備穩(wěn)定性,適合分治策略下的有序合并。

盡管 stable_sort() 提供了穩(wěn)定性保障,但其代價(jià)是更高的內(nèi)存消耗和潛在的性能下降(尤其在大數(shù)據(jù)集上)。對(duì)于金融系統(tǒng)、考試排名、事件日志等場(chǎng)景,穩(wěn)定性是硬性需求,應(yīng)無(wú)條件選用 stable_sort()。

4、小結(jié)

  • std::sort:更快、更省內(nèi)存,但不保證穩(wěn)定性。
  • std::stable_sort:稍慢、更耗內(nèi)存,但保證穩(wěn)定性。
  • 一句話:性能優(yōu)先用 sort,順序敏感用 stable_sort。
  • 備注:對(duì)于頻繁排序的小型容器,可考慮使用 std::list::sort()

5、示例代碼

#include <string>
#include <vector>
#include <list>
#include <iostream>
#include <algorithm>//sort

using std::vector;
using std::list;
using std::string;

struct Student
{
    string name;
    double score;
    Student(const string &n, double s) : name(n), score(s) {}
    // 重載 operator< 以按score升序排序(list::sort)
    bool operator<(const Student& other) const {
        return score < other.score;
    }
};

bool CompareByScore(const Student& a, const Student& b) {
    return a.score > b.score; // 降序
}
//
bool CompareStudent(const Student& a, const Student& b) {
    if (a.score != b.score){
        return a.score < b.score;
    }
    return a.name < b.name; // 成績(jī)相同時(shí)按名字升序
}

int main(int argc, char *argv[])
{
    std::vector<Student> studentArray = {
        {"Candy", 91.0},
        {"Body", 91.0},
        {"Andy", 91.0},
        {"Lucy", 91.0},
        {"Lily", 90.5},
        {"Luck", 92.5},
        {"Kandy", 95.0},
    };

    do{
        std::cout << "v1: std::sort" << std::endl;
        auto v1 = studentArray;
        std::sort(v1.begin(), v1.end(), [](const Student &a, const Student &b){
            return a.score > b.score;//降序
        });
        for (const auto& s : v1) {
            std::cout << s.name << ": " << s.score << "\n";
        }
    }while(false);


    do{
        // 使用 stable_sort 保證同分學(xué)生順序不變
        std::cout << "\nv2: std::stable_sort" << std::endl;
        auto v2 = studentArray;
        std::stable_sort(v2.begin(), v2.end(), CompareByScore);
        for (const auto& s : v2) {
            std::cout << s.name << ": " << s.score << "\n";
        }
    }while(false);


    do{
        // 對(duì)于頻繁排序的小型容器,可考慮使用 std::list::sort()(穩(wěn)定且鏈表友好)
        std::list<Student> studentList;
        for (const auto& s : studentArray){
            studentList.push_back(s);
        }

        // 使用 std::list::sort() 進(jìn)行排序
        std::cout << "\nlist1: sort" << std::endl;
        auto list1 = studentList;
        list1.sort();                 // 使用 operator<
        for (const auto& s : list1) {
            std::cout << s.name << ": " << s.score << "\n";
        }

        //使用自定義比較函數(shù)
        std::cout << "\nlist2: CompareStudent" << std::endl;
        auto list2 = studentList;
        list2.sort(CompareStudent);
        for (const auto& s : list2) {
            std::cout << s.name << ": " << s.score << "\n";
        }
    }while(false);

    return 0;
}

總結(jié) 

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

相關(guān)文章

  • 詳解C++動(dòng)態(tài)內(nèi)存管理

    詳解C++動(dòng)態(tài)內(nèi)存管理

    這篇文章主要為大家詳細(xì)介紹了C++中動(dòng)態(tài)內(nèi)存管理相關(guān)資料,文中示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++具有一定幫助,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)
    2023-05-05
  • return和break的區(qū)別解析

    return和break的區(qū)別解析

    這篇文章主要介紹了return和break的區(qū)別解析,需要的朋友可以參考下
    2014-02-02
  • C語(yǔ)言自定義類型之聯(lián)合和枚舉解讀

    C語(yǔ)言自定義類型之聯(lián)合和枚舉解讀

    聯(lián)合體共享內(nèi)存,大小由最大成員決定,遵循對(duì)齊規(guī)則;枚舉類型列舉可能值,提升可讀性和類型安全性,兩者在C語(yǔ)言中用于優(yōu)化內(nèi)存和程序效率
    2025-08-08
  • 一篇文章帶你了解C語(yǔ)言二分查找的簡(jiǎn)單應(yīng)用

    一篇文章帶你了解C語(yǔ)言二分查找的簡(jiǎn)單應(yīng)用

    這篇文章主要介紹了二分查找算法在C語(yǔ)言程序中的使用示例,文中最后提到了使用二分查找法一個(gè)需要注意的地方,需要的朋友可以參考下
    2021-08-08
  • 探討:C++中函數(shù)返回引用的注意事項(xiàng)

    探討:C++中函數(shù)返回引用的注意事項(xiàng)

    本篇文章是對(duì)C++中函數(shù)返回引用的注意事項(xiàng)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++中的不規(guī)則二維數(shù)組實(shí)現(xiàn)代碼

    C++中的不規(guī)則二維數(shù)組實(shí)現(xiàn)代碼

    本文介紹了一個(gè)在C++中保存不定長(zhǎng)二維數(shù)組的數(shù)據(jù)結(jié)構(gòu),在這個(gè)結(jié)構(gòu)中,我們使用了一個(gè)含有指針和數(shù)組長(zhǎng)度的結(jié)構(gòu)體,用這樣的一個(gè)結(jié)構(gòu)體構(gòu)造一個(gè)結(jié)構(gòu)體數(shù)組,用于存儲(chǔ)每一個(gè)不定長(zhǎng)的數(shù)組,感興趣的朋友一起看看吧
    2024-03-03
  • C語(yǔ)言Easyx實(shí)現(xiàn)貪吃蛇詳解

    C語(yǔ)言Easyx實(shí)現(xiàn)貪吃蛇詳解

    這篇文章主要為大家詳細(xì)介紹了基于easyx的C++實(shí)現(xiàn)貪吃蛇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++中move的使用及說(shuō)明

    C++中move的使用及說(shuō)明

    這篇文章主要介紹了C++中move的使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語(yǔ)言實(shí)現(xiàn)用?*?打印X形圖案

    C語(yǔ)言實(shí)現(xiàn)用?*?打印X形圖案

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)用?*?打印X形圖案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++深入探究繼承的概念與使用

    C++深入探究繼承的概念與使用

    繼承是C++面向?qū)ο缶幊讨械囊婚T。繼承是子類繼承父類的特征和行為,或者是繼承父類得方法,使的子類具有父類得的特性和行為。重寫是子類對(duì)父類的允許訪問(wèn)的方法實(shí)行的過(guò)程進(jìn)行重新編寫,返回值和形參都不能改變。就是對(duì)原本的父類進(jìn)行重新編寫,但是外部接口不能被重寫
    2022-05-05

最新評(píng)論

安仁县| 西安市| 积石山| 自贡市| 怀集县| 大冶市| 武威市| 南郑县| 襄樊市| 洛南县| 中卫市| 荥阳市| 株洲市| 岳西县| 泰宁县| 翁源县| 红原县| 靖西县| 太白县| 板桥市| 阳山县| 西峡县| 聂荣县| 泾阳县| 邵东县| 保康县| 龙游县| 泽库县| 会东县| 东阿县| 靖江市| 泽普县| 确山县| 辽阳市| 腾冲县| 嘉峪关市| 平和县| 海安县| 红原县| 正定县| 岫岩|