开发环境:QtCreator2.1.0+OpenCV2.4.8
首先来看看std中的快速排序算法sort的使用方法:</span>
template <class RandomAccessIterator, class Compare> void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
这是一个带模板的函数,参数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;
}
则会报错如下错误:
实验结果
本次实验是基于这样一个问题的:有一个含有8个整数的数组,现在需要对数组排序,然后取出最大的前三个值对应的下标将其对应位置1其它为0,最后将该八位二进制数转换成一个十进制数。有尝试过把下标和它对应的值放在map中,然后对map中的元素用std::sort()进行排序,但是由于开始没有发现那个重载符号的使用,所以没有调试成功。现在直接不用map了,而是用vector,vector里面放的是带有下标和其对应值的struct。
本次实验是在vector中存入8个结构体对象,每个结构体中放入一个整数下标和它对应的值,然后采用sort()对齐排序,排序结果如下:
实验代码
完整Qt工程下载:http://download.csdn.net/detail/j_d_c/9327369
main.cpp:
#include <QtCore/QCoreApplication>
#include <iostream>
#include <vector>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <QDebug>
using namespace cv;
using namespace std;
typedef struct
{
int position;
long pos_value;
} PAIR;
/*按照降序排列*/
bool operator<(const PAIR &x, const PAIR &y)
{
return x.pos_value > y.pos_value;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
#if 1
int codebit[8]={0};
int tt[8] = {11,11,12,18,15,16,19,20};
PAIR pair[8];
vector<PAIR> vec;
for(int i=0;i<8;i++)
{
pair[i].position = i;
pair[i].pos_value = tt[i];
vec.push_back(pair[i]);
}
sort(vec.begin(), vec.end());
cout << "排序的结果为:" << endl;
for(vector<PAIR>::iterator it = vec.begin(); it < vec.begin()+3; ++it) {
//cout << it->point << endl;
cout << it->position<<" "<<it->pos_value << endl;
codebit[it->position] = 1;
}
cout << endl<<"codebit: ";
for(int i=0;i<8;i++)
qDebug()<< codebit[i];
double ldp = codebit[7]*pow(2.0,7.0)+codebit[6]*pow(2.0,6.0)+codebit[5]*pow(2.0,5.0)+codebit[4]*pow(2.0,4.0)
+ codebit[3]*pow(2.0,3.0)+codebit[2]*pow(2.0,2.0)+codebit[1]*pow(2.0,1.0)+codebit[0]*pow(2.0,0.0);
cout<<endl<<"ldp = "<<ldp<<endl;
#endif
return a.exec();
}
实验总结
std::sort()函数的功能很强大,且可以对类,结构体等元素进行排序。