C++ 關(guān)于STL中sort()對(duì)struct排序的方法
前言
一直沒(méi)有系統(tǒng)去看過(guò)c++,因?yàn)槎靡恍ヽ的基本語(yǔ)法,在實(shí)際編程中用到c++,只能用到哪些看哪些,發(fā)現(xiàn)這樣雖然能夠完成大部分工作,但是有時(shí)候效率實(shí)在太低,比如說(shuō)這節(jié)要講的Std::sort()函數(shù)的使用,調(diào)了半天才調(diào)通。開(kāi)通c/c++序列博客是記錄在使用c++中一些難題,避免以后重犯錯(cuò),當(dāng)然以后會(huì)盡量擠出時(shí)間來(lái)較系統(tǒng)學(xué)習(xí)下c++。
開(kāi)發(fā)環(huán)境:QtCreator2.5.1+OpenCV2.4.3
實(shí)驗(yàn)基礎(chǔ)
首先來(lái)看看std中的快速排序算法sort的使用方法:
template <class RandomAccessIterator, class Compare> void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
這是一個(gè)帶模板的函數(shù),參數(shù)1和2表示需要排序的元素在隨機(jī)迭代器的起始位置和結(jié)束位置,其迭代器指向的數(shù)據(jù)類(lèi)型可以自己定義,常見(jiàn)的數(shù)據(jù)類(lèi)型包括結(jié)構(gòu)體,vector,類(lèi)等都可以被使用。參數(shù)comp是用來(lái)決定所采用的排序是升序還是逆序的,默認(rèn)情況下是升序排列。但是這種默認(rèn)情況的優(yōu)勢(shì)是處理迭代器指向的元素為普通的數(shù)據(jù)類(lèi)型,比如說(shuō)整型,字符型等。如果指向的數(shù)據(jù)類(lèi)型為類(lèi)或者結(jié)構(gòu)體,然后使用該類(lèi)或者結(jié)構(gòu)體中的某個(gè)元素進(jìn)行排序,這時(shí)候需要自己定義排序的重載符號(hào)”<”。比如說(shuō)在本次實(shí)驗(yàn)中該重載符號(hào)的定義為:
復(fù)制代碼 代碼如下:
/*按照降序排列*/
bool compare(const PAIR &x, const PAIR &y)
{
return x.point_value > y.point_value;
}
如果將comp定義為一個(gè)函數(shù)(網(wǎng)上好像很多都是用這種類(lèi)似的函數(shù)),比如說(shuō)該函數(shù)如下:復(fù)制代碼 代碼如下:
/*按照降序排列*/
bool operator<(const PAIR &x, const PAIR &y)
{
return x.point_value > y.point_value;
}
則會(huì)報(bào)錯(cuò)如下錯(cuò)誤:
std::sort因?yàn)楹瘮?shù)參數(shù)不明確,所以無(wú)法推導(dǎo)出模板參數(shù)等.
實(shí)驗(yàn)結(jié)果
本次實(shí)驗(yàn)是基于這樣一個(gè)問(wèn)題的:有一些坐標(biāo)點(diǎn)集合(2d的坐標(biāo)點(diǎn),坐標(biāo)點(diǎn)之間沒(méi)有重復(fù)),每個(gè)坐標(biāo)點(diǎn)對(duì)應(yīng)一個(gè)數(shù),現(xiàn)在需要對(duì)這些數(shù)排序從而達(dá)到對(duì)這些坐標(biāo)點(diǎn)排序。有嘗試過(guò)把點(diǎn)的坐標(biāo)和它對(duì)應(yīng)的值放在map中,然后對(duì)map中的元素用std::sort()進(jìn)行排序,但是由于開(kāi)始沒(méi)有發(fā)現(xiàn)那個(gè)重載符號(hào)的使用,所以沒(méi)有調(diào)試成功。現(xiàn)在直接不用map了,而是用vector,vector里面放的是帶有坐標(biāo)點(diǎn)和其對(duì)應(yīng)值的struct。
本次實(shí)驗(yàn)是在vector中存入3個(gè)結(jié)構(gòu)體對(duì)象,每個(gè)結(jié)構(gòu)體中放入一個(gè)二維點(diǎn)和它對(duì)應(yīng)的值,然后采用sort()對(duì)齊排序,排序結(jié)果如下:
實(shí)驗(yàn)代碼及注釋
main.cpp:
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
typedef struct
{
cv::Point point;
long point_value;
} PAIR;
/*按照降序排列*/
bool operator<(const PAIR &x, const PAIR &y)
{
return x.point_value > y.point_value;
}
///*按照降序排列*/
//bool compare(const PAIR &x, const PAIR &y)
//{
// return x.point_value > y.point_value;
//}
void main()
{
PAIR pair1, pair2, pair3;
std::vector<PAIR> vec;
pair1.point = Point(10, 20);
pair1.point_value = 100;
pair2.point = Point(70, 30);
pair2.point_value = 99;
pair3.point = Point(44, 76);
pair3.point_value = 101;
vec.push_back(pair1);
vec.push_back(pair2);
vec.push_back(pair3);
// std::sort(vec.begin(), vec.end(), compare);
std::sort(vec.begin(), vec.end());
cout << "排序的結(jié)果為:" << endl;
for(vector<PAIR>::iterator it = vec.begin(); it != vec.end(); ++it) {
cout << it->point << endl;
}
return ;
}
實(shí)驗(yàn)總結(jié)
std::sort()函數(shù)的功能很強(qiáng)大,且可以對(duì)類(lèi),結(jié)構(gòu)體等元素進(jìn)行排序。
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)自動(dòng)發(fā)牌程序
這篇文章主要介紹了利用C語(yǔ)言實(shí)現(xiàn)自動(dòng)發(fā)牌程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12C++利用循環(huán)和棧實(shí)現(xiàn)走迷宮
這篇文章主要為大家詳細(xì)介紹了C++利用循環(huán)和棧實(shí)現(xiàn)走迷宮,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05C++對(duì)string進(jìn)行大小寫(xiě)轉(zhuǎn)換操作方法
這篇文章主要介紹了C++對(duì)string進(jìn)行大小寫(xiě)轉(zhuǎn)換操作方法,本文通過(guò)兩種方法結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02C++ 17標(biāo)準(zhǔn)正式發(fā)布! 更簡(jiǎn)單地編寫(xiě)和維護(hù)代碼
C++ 17 標(biāo)準(zhǔn)正式發(fā)布:終于能更簡(jiǎn)單地編寫(xiě)和維護(hù)代碼了!本文為大家介紹了C ++ 17 主要特性,感興趣的小伙伴們可以參考一下2017-12-12C++基礎(chǔ)入門(mén)教程(六):為什么創(chuàng)建類(lèi)的時(shí)候要用new?
這篇文章主要介紹了C++基礎(chǔ)入門(mén)教程(六):為什么創(chuàng)建類(lèi)的時(shí)候要用new?本文講解了使用new創(chuàng)建動(dòng)態(tài)結(jié)構(gòu)體、為什么要有new、自動(dòng)存儲(chǔ)(自動(dòng)變量、局部變量)、動(dòng)態(tài)存儲(chǔ)、vector和array等內(nèi)容,需要的朋友可以參考下2014-11-11C語(yǔ)言實(shí)現(xiàn)繪制繞線畫(huà)的示例代碼
繞線畫(huà)簡(jiǎn)單點(diǎn)來(lái)說(shuō),就是在木板上釘一圈釘子,通過(guò)繞線進(jìn)行構(gòu)圖,最終呈現(xiàn)出一幅圖像。本文將用C語(yǔ)言實(shí)現(xiàn)這一效果,感興趣的小伙伴可以嘗試一下2022-11-11結(jié)合C++11新特性來(lái)學(xué)習(xí)C++中l(wèi)ambda表達(dá)式的用法
這篇文章主要介紹了C++中l(wèi)ambda表達(dá)式的用法,lambda表達(dá)式的引入可謂是C++11中的一大亮點(diǎn),同時(shí)文中也涉及到了C++14標(biāo)準(zhǔn)中關(guān)于lambda的一些內(nèi)容,需要的朋友可以參考下2016-01-01C語(yǔ)言中數(shù)據(jù)結(jié)構(gòu)之鏈表歸并排序?qū)嵗a
這篇文章主要介紹了C語(yǔ)言中數(shù)據(jù)結(jié)構(gòu)之鏈表歸并排序?qū)嵗a的相關(guān)資料,需要的朋友可以參考下2017-05-05