set简介

set一般插入元素时,默认使用关键字类型的< 运算符来比较两个关键字,故一般插入后为升序,但是针对自定义数据结构,如结构体,没有< 运算符,故无法进行比较。针对自定义数据结构或者说自定义set排序规则有如下几种方法:

方法一 重载<

在自定义结构体中重载< 则可以实现默认排序,示例代码如下:

#include<iostream>
#include<set>
using namespace std;struct Students
{string id;int age,height;Students(string s,int a,int h):id(s),age(a),height(h){}Students() {}bool operator <(const Students &s) const {if(id!=s.id) return id<s.id;else return age<s.age;}
};
int main(){set<Students> se;se.insert(Students("zhou",12,134));se.insert(Students("wu",13,42));se.insert(Students("zheng",34,43));se.emplace("wang",13,43);se.emplace("zhou",23,43);for(auto it=se.begin();it!=se.end();it++){cout<<it->id<<" "<<it->age<<" "<<it->height<<endl;}return 0;
}

运行结果如下:

方法二 重载()

示例代码如下:

#include<iostream>
#include<set>
using namespace std;struct Students
{string id;int age,height;Students(string s,int a,int h):id(s),age(a),height(h){}Students() {}
};class comp{
public:bool operator()(const Students &s1,const Students &s2){if(s1.id!=s2.id) return s1.id<s2.id;return s1.age<s2.age;}
};int main(){set<Students,comp> se;se.insert(Students("zhou",12,134));se.insert(Students("wu",13,42));se.insert(Students("zheng",34,43));se.emplace("wang",13,43);se.emplace("zhou",23,43);for(auto it=se.begin();it!=se.end();it++){cout<<it->id<<" "<<it->age<<" "<<it->height<<endl;}return 0;
}

方法三 参考《C++ primer(第五版)》

示例代码如下:

#include<iostream>
#include<set>
using namespace std;struct Students
{string id;int age,height;Students(string s,int a,int h):id(s),age(a),height(h){}Students() {}
};bool cmp(const Students &s1,const Students &s2){if(s1.id!=s2.id) return s1.id<s2.id;return s1.age<s2.age;
}int main(){set<Students,decltype(cmp)*> se(cmp);se.insert(Students("zhou",12,134));se.insert(Students("wu",13,42));se.insert(Students("zheng",34,43));se.emplace("wang",13,43);se.emplace("zhou",23,43);for(auto it=se.begin();it!=se.end();it++){cout<<it->id<<" "<<it->age<<" "<<it->height<<endl;}return 0;
}

上述代码中,用decltype 来指出自定义操作的类型。当使用decltype 来获得一个函数指针类型时,必须加上一个* 来指出我们要使用一个给定函数类型的指针。用cmp 来初始化se对象,这表示当我们向se中插入元素时,通过调用cmp来为这些元素排序。可以使用cmp代替&cmp作为构造函数的参数,因为当我们使用一个函数的名字时,在需要的情况下会自动转化为一个指针,使用&cmp 效果也是一样的。

insertemplace 的使用

emplace对应insert,emplace_back对应于push_back;但是insertpush_back是直接将对象拷贝至容器当中,而emplaceemplace_back是先调用存储对象构造函数,在内存中生成对象,然后拷贝至容器中。

C++ set自定义排序相关推荐

  1. 数据库中自定义排序规则,Mysql中自定义字段排序规则,Oracle中自定义字段排序规则,decode函数的用法,field函数的用法

    数据库中自定义排序 场景:有一张banner表,表中有一个status字段,有0, 1, 2三个状态位,我想要 1,0,2的自定义排序(这里是重点),然后再进行之上对sequence字段进行二次排序( ...

  2. SpringDataJpA复杂查询实现自定义排序

    需求: 列表页面实现按合同状态自定义排序 private Specification<TblContractPre> whereClause(final TblContractPre en ...

  3. .NET/C#中对自定义对象集合进行自定义排序的方法

    一个集合可否排序,要看系统知不知道排序的规则,像内建的系统类型,int ,string,short,decimal这些,系统知道怎么排序,而如果一个集合里面放置的是自定义类型,比如自己定义了一个Car ...

  4. MapReduce编程实例之自定义排序

    任务描述: 给出一组数据,自定义排序的样式,第一列降序,相同时第二列升序 example Data: 2013 1 2013 5 2014 5 2014 8 2015 9 2015 4 Code: p ...

  5. R语言dplyr包arrage函数排序dataframe实战:单列排序、多列排序、自定义排序

    R语言dplyr包arrage函数排序dataframe实战:单列排序.多列排序.自定义排序 目录 R语言dplyr包arrage函数排序dataframe实战:单列排序.多列排序

  6. pandas dataframe中的列进行重新排序、倒排、正排、自定义排序详解及实践

    pandas dataframe中的列进行重新排序,pandas dataframe列重排.倒排.正排.自定义排序详解及实践 实施数据构建: import pandas as pd import nu ...

  7. 先随机后排序的oracle,Oracle用decode函数或CASE-WHEN实现自定义排序

    Oracle用decode函数或CASE-WHEN实现自定义排序 1 问题 对SQL排序,只要在order by后面加字段就可以了,可以通过加desc或asc来选择降序或升序.但排序规则是默认的,数字 ...

  8. java hashmap 无序,【Java】HashMap自定义排序

    HashMap中的对象根据成员进行自定义排序 Map是Java中最常用的存储对象的集合类之一,存储在HashMap中的对象在取出时是无序的,下文以示例介绍了如果对HashMap中存储的对象根据成员进行 ...

  9. DEV控件自定义排序实现

    一般的控件或者组件都支持按照某一列进行排序.但是,这种排序是根据数据源里的数据默认按照降序或升序排序的,同时这样的排序与字段的类型有关. 假设现在字段的类型是字符串类型 ,但是,存储的数据时数字加一些 ...

  10. excel 按数据拆分 xlam_Excel按类别名称自定义排序:玩转Excel数据

    作者:易雪龙 转自:Word联盟 在平常工作中,可能会有多个人,或者多个部门来记录一些数据,最终,我们会将这些数据一一整理综合到一个表格里面来.但是,数据经过复制过来后,是比较乱的,比如说,同一姓名, ...

最新文章

  1. Linux(64位)下OpenBabel 2.4.1、python2.7和Ipython实战(三)
  2. flask+sqlite3+echarts3+ajax 异步数据加载
  3. 微软计划使用 Rust 取代 C和C+
  4. 判断 iframe 是否加载完成的完美方法
  5. java writeint_Java DataOutputStream.writeInt(int v)类型
  6. implements Serializable
  7. Mysql中常用的函数汇总
  8. 如何用python处理图片_推荐:10个Python图像处理工具
  9. SAP License:SAP的采购批准策略
  10. 千万别说你会Python!如果不知道这10个Python包!
  11. PB语言实现反射机制
  12. 如何使用U盘制作苹果系统启动盘
  13. 计算机的网关地址是什么,什么是网关 网关地址是什么
  14. 从本质出发理解掌握三大坐标系下的三大方程(三)--旋度公式
  15. Java--网络编程(利用TCP实现简单的双人聊天)
  16. Qt 免注册版本下载
  17. lucene--简介
  18. Web与排版学上的字体问题【转】
  19. 用清水洗手和肥皂、洗手液等洗手的区别???
  20. 最新CentOS7.5部署L版ceph 20190610及额外手册告警升级多活等

热门文章

  1. 自己来制作iso镜像用于安装OpenBSD
  2. 计算机专业暑期三下乡活动方案,暑期三下乡活动方案
  3. 条码打印软件如何设置双排标签纸尺寸
  4. 如何设置PPT里的表格行高等高
  5. 用火箭送快递?淘宝宣布联合蓝箭航天起启动“宝箭”计划
  6. SEO与SEM有什么区别?
  7. 使用Arduino,DHT11和IR Blaster的自动交流温度控制器
  8. 公约数和公倍数(Python)
  9. 文件太多,台式电脑迁移数据到笔记本怎么操作?
  10. 网站访问速度优化之二 - JS和CSS优化