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
關於心理的二十五種傾向(查理·芒格)-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。
Linux五種IO模型性能分析
增加 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 在文檔流中,若父元素未設置高度,那麽父元素的高度默認是被子元素撐開的,即子元素多高,父元素就有多高。但是當子元素設置浮動之後,子元素就會完全脫離文檔流,父元素還在文檔流中,此時父元素的高度就沒有子