1. 程式人生 > >STL Sort的五種使用示例

STL Sort的五種使用示例

Sort是一種高效的排序演算法,常使用的五種示例如下。
示例程式碼採用編譯器vs2012,任何一款支援c++11標準的編譯器都可以執行。

包含標頭檔案

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>

1、過載操作符
過載對應操作符<、>、<=、>=來實現排序
程式碼

namespace SORT_1
{
    //過載操作符
    struct StTest
    {
        StTest(int
nInput) : nVal(nInput) {} bool operator<(const StTest& other) const { return (this->nVal < other.nVal); } bool operator<=(const StTest& other) const { return (this->nVal <= other.nVal); } bool
operator>(const StTest& other) const { return (this->nVal > other.nVal); } bool operator>=(const StTest& other) const { return (this->nVal >= other.nVal); } int nVal; }; void Test() { std
::vector<StTest> vTest; vTest.push_back(StTest(3)); vTest.push_back(StTest(2)); vTest.push_back(StTest(5)); vTest.push_back(StTest(4)); vTest.push_back(StTest(1)); //從小到大排序 std::sort(vTest.begin(), vTest.end(), std::less<StTest>()); for (auto elem : vTest) { std::cout<<(elem.nVal)<<" "; } std::cout<<std::endl; //從大到小排序 std::sort(vTest.begin(), vTest.end(), std::greater<StTest>()); for (auto elem : vTest) { std::cout<<(elem.nVal)<<" "; } std::cout<<std::endl; } }

呼叫
SORT_1::Test();

結果
1 2 3 4 5
5 4 3 2 1

2、函式指標
示例程式碼

namespace SORT_2
{
    //函式指標
    struct StTest
    {
        StTest(int nInput)
            : nVal(nInput)
        {}

        int nVal;
    };

    bool SortFunc(const StTest& lVal, const StTest& rVal)
    {
        return (lVal.nVal < rVal.nVal);
    }

    void Test()
    {
        std::vector<StTest> vTest;
        vTest.push_back(StTest(3));
        vTest.push_back(StTest(2));
        vTest.push_back(StTest(5));
        vTest.push_back(StTest(4));
        vTest.push_back(StTest(1));

        std::sort(vTest.begin(), vTest.end(), SortFunc);
        for (auto elem : vTest)
        {
            std::cout<<(elem.nVal)<<" ";
        }
        std::cout<<std::endl;
    }
}

呼叫
SORT_2::Test();

結果
1 2 3 4 5

3、仿函式
當排序需要傳參時,我們可以用仿函式。
程式碼示例

namespace SORT_3
{
    //仿函式
    struct StTest
    {
        StTest(int nInput)
            : nVal(nInput)
        {}

        int nVal;
    };

    //求模後排序
    class CModuleFunc
    {
    public:
        CModuleFunc(int nTest)
            : m_nTest(nTest)
        {}

        bool operator()(const StTest& lVal, const StTest& rVal)
        {
            if (m_nTest <= 0) {return false;}

            int nlModule = (lVal.nVal%m_nTest);
            int nrModule = (rVal.nVal%m_nTest);
            return (nlModule < nrModule);
        }

    private:
        int m_nTest;
    };

    void Test()
    {
        std::vector<StTest> vTest;
        vTest.push_back(StTest(3));
        vTest.push_back(StTest(2));
        vTest.push_back(StTest(5));
        vTest.push_back(StTest(4));
        vTest.push_back(StTest(1));

        std::sort(vTest.begin(), vTest.end(), CModuleFunc(3));
        for (auto elem : vTest)
        {
            std::cout<<(elem.nVal)<<" ";
        }
        std::cout<<std::endl;
    }
}

呼叫
SORT_3::Test();

結果
3 4 1 2 5

4、bind+function
c++11引入了bind和function,我們可以簡化一下仿函式寫法。

程式碼示例

namespace SORT_4
{
    //bind+function
    struct StTest
    {
        StTest(int nInput)
            : nVal(nInput)
        {}

        int nVal;
    };

    //求模後排序
    bool ModuleFunc(const StTest& lVal, const StTest& rVal, int nTest)
    {
        if (nTest <= 0) {return false;}

        int nlModule = (lVal.nVal%nTest);
        int nrModule = (rVal.nVal%nTest);
        return (nlModule < nrModule);
    }

    void Test()
    {
        std::vector<StTest> vTest;
        vTest.push_back(StTest(3));
        vTest.push_back(StTest(2));
        vTest.push_back(StTest(5));
        vTest.push_back(StTest(4));
        vTest.push_back(StTest(1));

        //pFnc型別:std::function<bool (const StTest&, const StTest&)>
        auto pFunc = std::bind(&ModuleFunc, std::placeholders::_1, std::placeholders::_2, 3);
        std::sort(vTest.begin(), vTest.end(), pFunc);
        for (auto elem : vTest)
        {
            std::cout<<(elem.nVal)<<" ";
        }
        std::cout<<std::endl;
    }
}

呼叫
SORT_4::Test();

結果
3 4 1 2 5

5、lambda
C++ 11引入了lambda,可以建立匿名函式來簡化排序。
程式碼

namespace SORT_5
{
    //lambda
    struct StTest
    {
        StTest(int nInput)
            : nVal(nInput)
        {}

        int nVal;
    };

    void Test()
    {
        std::vector<StTest> vTest;
        vTest.push_back(StTest(3));
        vTest.push_back(StTest(2));
        vTest.push_back(StTest(5));
        vTest.push_back(StTest(4));
        vTest.push_back(StTest(1));

        //採用lambda來進行排序
        int nTest = 3;
        std::sort(vTest.begin(), vTest.end(), [&nTest](const StTest& lVal, const StTest& rVal){
            if (nTest <= 0) {return false;}

            int nlModule = (lVal.nVal%nTest);
            int nrModule = (rVal.nVal%nTest);
            return (nlModule < nrModule);
        });

        for (auto elem : vTest)
        {
            std::cout<<(elem.nVal)<<" ";
        }
        std::cout<<std::endl;
    }
}

呼叫
SORT_5::Test();

結果
3 4 1 2 5

6、總結
當操作物件已過載操作符時,可以直接sort
當排序演算法是區域性臨時演算法時,可以採用lambda
當排序演算法可提出共用時,可採用bind+function

相關推薦

STL Sort使用示例

Sort是一種高效的排序演算法,常使用的五種示例如下。 示例程式碼採用編譯器vs2012,任何一款支援c++11標準的編譯器都可以執行。 包含標頭檔案 #include <iostream> #include <vector> #i

STL】vector的建構函式

vector的五種建構函式, 例子摘自MSDNvoid test_vector_constructor() { // 0. Create an empty vector v0 std::vector<int> v0; assert(v0.empty());

.NetCore上傳多文件的幾示例

file 上傳文件 multiple 本章和大家分享的是.NetCore的MVC框架上傳文件的示例,主要講的內容有:form方式提交上傳,ajax上傳,ajax提交+上傳進度效果,Task並行處理+ajax提交+上傳進度,相信當你讀完文章內容後能後好的收獲,如果可以不妨點個贊;由於昨天電腦沒電了,

快速理解Java中的單例模式

嵌套類 ati class 由於 aop 適合 singleton 重復 code 解法一:只適合單線程環境(不好) package test; /** * @author xiaoping * */ public class Singleton { pri

關於心理的二十傾向(查理&#183;芒格)-2

沖突 環境 國際 data- 優勢 幫助 data 貪婪 必須 5)避免不一致傾向避免不一致傾向實際上就是人天生就害怕改變。相同是由於人類大腦的生理機制決定的。由於這樣的傾向能夠帶來節省運算空間和能量的優點。這樣的抗改變模式的形成,可能的原因例如以下:A) 迅速作出決定對

SSH深度歷險(六) 深入淺出----- Spring事務配置的方式

配置 處理 數據 data easy ont get 添加 由於 這對時間在學習SSH中Spring架構,Spring的事務配置做了具體總結。在此之間對Spring的事務配置僅僅是停留在聽說的階段,總結一下。總體把控。通過這次的學習發覺Spring的事務

javaScript之this的情況

默認 事件處理 改變 app ont code 分析 click 函數 this一直是JavaScript研究的難題,特別是在筆試和面試中的各種程序分析問題中,也常常會被問到。下面來看一看this被運用的五中情況: (1) 純粹的函數調用 函

android Toast大全(情形)建立屬於你自己的Toast

right 其它 activity make div ins case tco title 搬運而來,如有雷同。絕非意外! Toast用於向用戶顯示一些幫助/提示。以下我做了5中效果,來說明Toast的強大,定義一個屬於你自己的Toast。

LinuxIO模型性能分析

增加 cep tab 整體 file-max 優勢 經歷 分享 函數調用 socket阻塞與非阻塞,同步與異步 作者:huangguisu 1. 概念理解 在進行網絡編程時,我們常常見到同步(Sync)/異步(Async),阻塞(Block)/非阻塞

對於這懶散成員該如何處理

項目團隊成員不怕他能力不足,就怕其態度懶散,工作不積極。對於這些懶散成員,不能夠放任不管。因為懶散會影響別人工作,容易引起其他認真工作不滿,也會引起其他成員對項目管理者管理不公的不滿。因此,要想帶出一支好團隊,請好好管理那些懶散的項目成員。要管理好這些人,需要找出原因,再分為治之。 項目團隊

aNDROID特效TOasT詳解

smo android roi aid window mobile ongl ast andro aNDROID%E5%92%8CWINDOWsMOBILE http://music.baidu.com/songlist/495782919 http://music.b

java線程狀態

image png 轉換 tro java線程 str 分享 技術分享 ron java線程五種狀態: 創建 -> 就緒 -> 運行 -> 銷毀 創建 -> 就緒 -> 運行 -> 等待(缺少資源) -> 銷毀 下圖:各種狀態轉換

PHP讀取文件內容的方式

ria feof function word man val toolbar article str php讀取文件內容的五種方式 分享下php讀取文件內容的五種方法:好吧,寫完後發現文件全部沒有關閉。實際應用當中,請註意關閉 fclose($fp);-- php讀取文件內

js不同的遍歷 (filter, map,foreach,every, some,)

efi reac undefined each 數組 log 是否 als filter var arr=[1,2,"a",2,4,1,4,"a",5,6,7,8,"aa","bb","c","a"] // foreach console.log(arr.forEach

struts2獲取表單數據之 屬性封裝 模型驅動 表達式封裝 對象封裝到list集合 對象封裝到map集合 方便的封裝方式

demo1 submit namespace auto nbsp return admin user pri 一、屬性封裝   屬性封裝是在action裏面設定屬性值,屬性名字一定要和表單中的name一樣,action中extends ActionSupport   dem

ajax readyState的狀態詳解

錯誤 生命 class 學習 rec led 初始 http 完成 0 - (未初始化)還沒有調用send()方法 1 - (載入)已調用send()方法,正在發送請求 2 - (載入完成)send()方法執行完成,已經接收到全部響應內容 3 - (交互)正在解析響應

IO模型分析

del 防止 驅動 可用 pin man details 數據同步 rep html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,

面向對象的三個基本特征 和 設計原則

對象相等 存在 正是 提高 都是 並不是 ram 無法 pro 面向對象的三個基本特征 和 五種設計原則 來源: http://blog.csdn.net/cancan8538/article/details/8057095 一、三個基本特征 面向對象的三個基本

【轉】英語學習-英語簡單句的句型結構

morn machine pic day pict usb 情況 fin ack  一、主語+不及物動詞(S+V)   [例句]1. The man cooks. 男人做飯。   2. The sun is shining brightly. 太陽在明亮地照耀著。   3.

父級塌陷清除浮動的方法

沒有 高度 overflow left 結束 方法 子元素 添加 block 在文檔流中,若父元素未設置高度,那麽父元素的高度默認是被子元素撐開的,即子元素多高,父元素就有多高。但是當子元素設置浮動之後,子元素就會完全脫離文檔流,父元素還在文檔流中,此時父元素的高度就沒有子