前言

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

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

  实验基础

  首先来看看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。

  本次实验是在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::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()函数的功能很强大,且可以对类,结构体等元素进行排序。

转载于:https://www.cnblogs.com/tornadomeet/archive/2012/12/08/2808923.html

C++笔记(1):使用STL中sort()对struct排序相关推荐

  1. STL中 sort 排序方法

    头文件:<algorithm> 排序格式:sort (a,a+n)--  指从a[0]到a[n-1]排序,他有两种形式 (1)默认从小到大排序 (2)加cmp自定义排序方式:sort (a ...

  2. STL中sort算法简析

    STL里sort算法简析 文章目录 STL里sort算法简析 一.引入 二.正解 三.源码 **`sort的源码`**: **`其中,__introsort_loop便是内省式排序:`** 插入排序 ...

  3. STL中sort排序的简单使用

    测试int的sort功能 #include <iostream> #include <string> #include <algorithm> #include & ...

  4. C++STL中的unique函数解析

    一.总述 unique函数属于STL中比较常用函数,它的功能是元素去重.即"删除"序列中所有相邻的重复元素(只保留一个).此处的删除,并不是真的删除,而是指重复元素的位置被不重复的 ...

  5. 【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)

    C++ 泛型编程 中的泛型算法和STL(sort,find,find) 1. 引言 1.1 简述泛型编程和STL的重要性 1.2 介绍泛型算法的基本概念 2. STL中的泛型算法 2.1 定义及主要特 ...

  6. c语言的erase函数,C++ STL标准库中sort,erase,remove_if函数的使用

    本篇介绍C++ STL中常用的几个函数 1.std::sort 1.1.sort函数包含在头文件为#include的c++标准库中,调用标准库里的排序方法可以实现对数据的排序. 1.2.sort函数的 ...

  7. C++ STL的sort 函数 以及自定义的比较函数

    没什么特别擅长的内容,先做个小笔记好了.在编程时,使用C++的标准模板库(STL)能节约工作量,增加代码的可读性,能灵活运用无疑会提高编程的效率,俗话说:Write less, create more ...

  8. 算法与数据结构模版(AcWing算法基础课笔记,持续更新中)

    AcWing算法基础课笔记 文章目录 AcWing算法基础课笔记 第一章 基础算法 1. 排序 快速排序: 归并排序: 2. 二分 整数二分 浮点数二分 3. 高精度 高精度加法 高精度减法 高精度乘 ...

  9. STL std::sort 源码分析

    转载自http://feihu.me/blog/2014/sgi-std-sort/ 最近在看sort源码,看到这篇博文很好,转发作为记录,转载侵权联系我删除 背景 在校期间,为了掌握这些排序算法,我 ...

最新文章

  1. java实现layui分页,MVC下实现LayUI分页的Demo
  2. AlertDialog 点击空白处、返回按钮 行为
  3. 网络推广是做什么的知道网站做301定向跳转对优化有什么帮助?
  4. java线程唤醒线程_Java中如何唤醒“指定的“某个线程
  5. java类型比较_Java数据类型的比较
  6. 天津海运[600751]股票
  7. leetcode 1035. 不相交的线(dp)
  8. (三)cuda8和cuda10的切换
  9. Synonyms 中文近义词工具包 -- 支持文本对齐,推荐算法,相似度计算,语义偏移,关键字提取,概念提取,自动摘要,搜索引擎等
  10. python 3des加密_Python 3DES 加密解密
  11. 跟论文作者要源码和数据集的邮件怎么写
  12. c# API串口通信
  13. python2.7.18绿色安装包制作
  14. 淘宝网禁售无证食品和保健品 问题商品将被屏蔽
  15. Miniconda安装TensorFlow并导入Pycharm
  16. 租用游艇问题——动态规划
  17. mysql更新10000条记录_如何快速更新数据库中的百万条数据
  18. 【自然语言处理】中文开源工具汇总(7种)
  19. 在线文件/文档预览/分页分片预览 之开源kkfileview(word转pdf,pdf截取,pdf转图片,Aspose jobConverter , OpenOffice ,libreoffice )
  20. c#进度条刻度_c# ProgressBar进度条方向和美观

热门文章

  1. The path C:\Oracle\Middleware\wlserver_10.3 contains the wrong version of WebLogic Server. Expect
  2. 我从佛学里悟到的自由
  3. akka入门书籍的示例代码
  4. python接口自动化发送get请求 详解(一)
  5. redis两种持久化模式
  6. linux下移动或者复制文件覆盖相同文件夹时,文件夹里面的每个文件都提示是否覆盖...
  7. CYQ.Data 轻量数据层之路 华丽升级 V1.3出世(五)
  8. [转]RamDisk导致远程桌面客户端无法启动问题
  9. Golang 环境变量须知
  10. Alpha冲刺 - (6/10)