C++关于STL中sort()对struct排序的方法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C++关于STL中sort()对struct排序的⽅法
⼀直没有系统去看过c++,因为懂得⼀些c的基本语法,在实际编程中⽤到c++,只能⽤到哪些看哪些,发现这样虽然能够完成⼤部分⼯作,但是有时候效率实在太低,⽐如说这节要讲的Std::sort()函数的使⽤,调了半天才调通。

开通c/c++序列博客是记录在使⽤c++中⼀些难题,避免以后重犯错,当然以后会尽量挤出时间来较系统学习下c++。

开发环境:QtCreator2.5.1+OpenCV2.4.3
⾸先来看看std中的快速排序算法sort的使⽤⽅法:
这是⼀个带模板的函数,参数1和2表⽰需要排序的元素在随机迭代器的起始位置和结束位置,其迭代器指向的数据类型可以⾃⼰定义,常见的数据类型包括结构体,vector,类等都可以被使⽤。

参数comp是⽤来决定所采⽤的排序是升序还是逆序的,默认情况下是升序排列。

但是这种默认情况的优势是处理迭代器指向的元素为普通的数据类型,⽐如说整型,字符型等。

如果指向的数据类型为类或者结构体,然后使⽤该类或者结构体中的某个元素进⾏排序,这时候需要⾃⼰定义排序的重载符号”<”。

⽐如说在本次实验中该重载符号的定义为:
复制代码代码如下:
/*按照降序排列*/
bool compare(const PAIR &x, const PAIR &y)
{
return x.point_value > y.point_value;
}
如果将comp定义为⼀个函数(⽹上好像很多都是⽤这种类似的函数),⽐如说该函数如下:
复制代码代码如下:
/*按照降序排列*/
bool operator<(const PAIR &x, const PAIR &y)
{
return x.point_value > y.point_value;
}
则会报错如下错误:
std::sort因为函数参数不明确,所以⽆法推导出模板参数等.
本次实验是基于这样⼀个问题的:有⼀些坐标点集合(2d的坐标点,坐标点之间没有重复),每个坐标点对应⼀个数,现在需要对这些数排序从⽽达到对这些坐标点排序。

有尝试过把点的坐标和它对应的值放在map中,然后对map中的元素⽤std::sort()进⾏排序,但是由于开始没有发现那个重载符号的使⽤,所以没有调试成功。

现在直接不⽤map了,⽽是⽤vector,vector⾥⾯放的是带有坐标点和其对应值的struct。

本次实验是在vector中存⼊3个结构体对象,每个结构体中放⼊⼀个⼆维点和它对应的值,然后采⽤sort()对齐排序,排序结果如下:
复制代码代码如下:
#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 << "排序的结果为:" << endl;
for(vector<PAIR>::iterator it = vec.begin(); it != vec.end(); ++it) {
cout << it->point << endl;
}
return ;
}
std::sort()函数的功能很强⼤,且可以对类,结构体等元素进⾏排序。

相关文档
最新文档