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

2016-02-19 10:02 82 1 收藏

给自己一点时间接受自己,爱自己,趁着下午茶的时间来学习图老师推荐的C++ 关于STL中sort()对struct排序的方法,过去的都会过去,迎接崭新的开始,释放更美好的自己。

【 tulaoshi.com - 编程语言 】

  前言

  一直没有系统去看过c++,因为懂得一些c的基本语法,在实际编程中用到c++,只能用到哪些看哪些,发现这样虽然能够完成大部分工作,但是有时候效率实在太低,比如说这节要讲的Std::sort()函数的使用,调了半天才调通。开通c/c++序列博客是记录在使用c++中一些难题,避免以后重犯错,当然以后会尽量挤出时间来较系统学习下c++。

  开发环境:QtCreator2.5.1+OpenCV2.4.3

  实验基础

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  首先来看看std中的快速排序算法sort的使用方法:

  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;
}

  则会报错如下错误:

  

  std::sort因为函数参数不明确,所以无法推导出模板参数等.

  实验结果

  本次实验是基于这样一个问题的:有一些坐标点集合(2d的坐标点,坐标点之间没有重复),每个坐标点对应一个数,现在需要对这些数排序从而达到对这些坐标点排序。有尝试过把点的坐标和它对应的值放在map中,然后对map中的元素用std::sort()进行排序,但是由于开始没有发现那个重载符号的使用,所以没有调试成功。现在直接不用map了,而是用vector,vector里面放的是带有坐标点和其对应值的struct。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  本次实验是在vector中存入3个结构体对象,每个结构体中放入一个二维点和它对应的值,然后采用sort()对齐排序,排序结果如下:

  

  实验代码及注释

  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::vectorPAIR 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(vectorPAIR::iterator it = vec.begin(); it != vec.end(); ++it) {
        cout it-point endl;
    }

    return ;
}

  实验总结

  std::sort()函数的功能很强大,且可以对类,结构体等元素进行排序。

来源:https://www.tulaoshi.com/n/20160219/1593110.html

延伸阅读
在学习c/c+过程中,指针是一个比较让人头痛的问题,稍微不注重将会是程序编译无法通过,甚至造成死机。在程序设计过程中,指针也往往是产生隐含bug的原因。下面就来谈谈指针的应用以及需要注重的一些问题,里面也许就有你平时没有注重到的问题,希望能帮助各位读者理解好指针。 !-- frame contents -- !-- /frame contents -- ...
  在c++中,为了解决一些频繁调用的小函数大量消耗栈空间或者是叫栈内存的问题,非凡的引入了inline修饰符,表示为内联函数。 !-- frame contents -- !-- /frame contents -- 可能说到这里,很多人还不明白什么是栈空间,其实栈空间就是指放置程序的局部数据也就是函数内数据的内存空间,在系统下...
标签: Web开发
但是让我感到意外的是,下面有个网友回复说,javascript中的Array本身的sort方法才是最快的,比快速排序算法都快,当时看到了很是郁闷,因为当时花了好长时间在排序算法上,居然忘记了Array本身的sort方法 不过javascript中内置的sort方法真的比快速排序算法还快吗? 哈哈,测试一下不就知道了 先说一下我测试的环境 1,我的测试环境是IE6....
堆内存是什么呢? 我们知道在c/c++中定义的数组大小必需要事先定义好,他们通常是分配在静态内存空间或者是在栈内存空间内的,但是在实际工作中,我们有时候却需要动态的为数组分配大小,在这里c库中的malloc.h头文件中的malloc()函数就为您解决了问题,(bc或者是在老的标准中是alloc.h),它的函数原形是void* malloc(size_t size),在动态开...
   持久对象 (persistent objects)广泛应用于游戏、分布式数据库系统、多媒体以及图形应用程序中。目前C++并不直接支持持久性(persistence)(但有一些在C++未来版本中添加持久性和反射(reflection)的建议)。 !-- frame contents -- !-- /frame contents -- 持久对象可以在创建它的程序的作用域之外保持自身状态。...

经验教程

743

收藏

61
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部