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

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

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

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

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

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

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

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

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

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

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

4、小結

  • std::sort:更快、更省內存,但不保證穩(wěn)定性。
  • std::stable_sort:稍慢、更耗內存,但保證穩(wěn)定性。
  • 一句話:性能優(yōu)先用 sort,順序敏感用 stable_sort。
  • 備注:對于頻繁排序的小型容器,可考慮使用 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; // 成績相同時按名字升序
}

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 保證同分學生順序不變
        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{
        // 對于頻繁排序的小型容器,可考慮使用 std::list::sort()(穩(wěn)定且鏈表友好)
        std::list<Student> studentList;
        for (const auto& s : studentArray){
            studentList.push_back(s);
        }

        // 使用 std::list::sort() 進行排序
        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;
}

總結 

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

相關文章

  • 詳解C++動態(tài)內存管理

    詳解C++動態(tài)內存管理

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

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

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

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

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

    一篇文章帶你了解C語言二分查找的簡單應用

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

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

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

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

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

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

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

    C++中move的使用及說明

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

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

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

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

    繼承是C++面向對象編程中的一門。繼承是子類繼承父類的特征和行為,或者是繼承父類得方法,使的子類具有父類得的特性和行為。重寫是子類對父類的允許訪問的方法實行的過程進行重新編寫,返回值和形參都不能改變。就是對原本的父類進行重新編寫,但是外部接口不能被重寫
    2022-05-05

最新評論

游戏| 永德县| 沾化县| 武功县| 桂平市| 屯门区| 周宁县| 庆云县| 鄯善县| 宁明县| 泰兴市| 濮阳市| 攀枝花市| 鸡东县| 安龙县| 佛学| 新和县| 宁城县| 墨竹工卡县| 延庆县| 伊宁市| 民县| 格尔木市| 桂东县| 梧州市| 琼中| 云龙县| 娱乐| 沁阳市| 乐都县| 新郑市| 鄂伦春自治旗| 张北县| 临沂市| 万宁市| 淮南市| 民权县| 汝州市| 巴东县| 密山市| 托里县|