精华内容
下载资源
问答
  • set自定义排序
    2021-09-29 11:01:03

    1、自然排序∶自定义类实现Comparable接口,重写compareTo方法,根据返回值进行排序。
    2、比较器排序︰创建TreeSet对象的时候传递Comparator的实现类对象,重写compare方法,根据返回值进行排序。在使用的时候,默认使用自然排序,当自然排序不满足现在的需求时,使用比较器排序

    两种方式中,关于返回值的规则︰
    如果返回值为负数,表示当前存入的元素是较小值,存左边
    如果返回值为0,表示当前存入的元素跟集合中元素重复了,不存如果返回值为正数,表示当前存入的元素是较大值,存右边
     

    更多相关内容
  • set自定义排序

    2020-08-15 21:24:33
    set简介 set一般插入元素时,默认使用关键字类型的< 运算符来比较两个关键字,故一般插入后为升序,但是针对自定义数据结构,如结构体,没有< 运算符...

    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;
    }
    
     
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    运行结果如下:
    这里写图片描述

    方法二 重载()

    示例代码如下:

    #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;
    }
    
     
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    方法三 参考《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;
    }
    
     
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

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

    insertemplace 的使用

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

    展开全文
  • c++ set 自定义排序

    2022-06-09 23:04:08
    c++ set 实现自定义排序

    c++ set默认是具有升序和自动去重的功能,但也可以按照读者自己的实现方式来进行自定义排序。通过重载运算符来实现。
    比如实现set容器降序排列:

    #include <iostream>
    #include <set>
    #include <map>
    #include <algorithm>
    using namespace std;
    class Mycompare{
    public:
        bool operator()(int v1, int v2){//重载运算符
            return v1 > v2;//降序排列
        }
    };
    int main() {
        set<int,Mycompare> s;
        s.insert(2);
        s.insert(5);
        s.insert(4);
        s.insert(8);
        s.insert(2);//自动去重
        for (set<int,Mycompare>::iterator it = s.begin(); it != s.end(); it++) {
            cout<<*it<<" ";
        }
        return 0;
    }
    //输出 8 5 4 2
    
    展开全文
  • C++ set自定义排序

    万次阅读 多人点赞 2018-04-02 15:07:53
    针对自定义数据结构或者说自定义set排序规则有如下几种方法: 方法一 重载&lt; 在自定义结构体中重载&lt; 则可以实现默认排序,示例代码如下: #include&lt;iostream&gt; #i...

    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 自定义排序

    万次阅读 多人点赞 2018-04-03 16:31:49
    2. set内部会维护一个严格的弱排序关系。上述两个特点实际上都依赖set的compare函数,compare函数判断两个元素相等就是相等,与元素本身没有直接的关系。默认定义了compare函数利用set内部默认的compare函数,可以将...
  • std::set自定义排序比较函数

    千次阅读 2020-07-10 13:21:23
    std::set默认是通过std::less函数来比较key值的。 #include <iostream> #include <set> void main() { std::set<int> mySet;... // 从小到大排序 for(auto it:mySet) { st
  • set容器排序:存放自定义数据类型; 自定义数据类型:都会指定排序规则 2、了解仿函数 仿函数functor的英文解释为something that performs a function,即其行为类似函数的东西。C++中的仿函数是通过在类中重载()...
  • Set自定义排序和去重规则

    千次阅读 2019-10-17 10:37:35
    我们日常常用的Set实现有HashSet,TreeSet,其中HashSet可以用来进行简单的去重(例如String,Integer等包装类型),并且是无序的(因为HashSet底层是用HashMap实现的,HashMap就是无序的),如果我们想自定义排序...
  • STL之Set自定义排序

    千次阅读 2016-05-23 20:38:20
    方法一、以类为比较器 struct classCompare { bool operator()(const int& lhs, const int& rhs) { return lhs ; } }; int main(void) { setint, classCompare> aSet ;
  • 在学习set/multiset容器时,容器如果非自己指定(如数据类型、排序规则),默认遵循从小到大的排序规则,今天以set容器为例,介绍如何对自定义数据类型进行降序排序。 毕竟,好记性不如烂笔头。 一、关于set/...
  • set 容器的自定义排序 默认数据类型 1.利用仿函数自定义set容器排序规则 重载()运算符 class Mycompare { public: bool operator()(int v1,int v2) { return v1>v2; } } ; 2.定义对应的set容器进行数据...
  • 用仿函数、lambda对set进行自定义排序 仿函数: 仿函数不是函数,它是个类; 仿函数重载了()运算符,使得它的对你可以像函数那样子调用(代码的形式好像是在调用函数)。 实现: 我先按照教材里的仿函数写,然后...
  • c++中的std::set,是基于红黑树的平衡二叉树的数据结构实现的一种容器,因为其中所包含的元素的值是唯一的,因此主要用于去重和排序。这篇文章的目的在于探讨和分享如何正确使用std::set实现去重和排序功能。 方法...
  • set> #include<iostream> // no duplicated numbers using namespace std; struct myComp{ bool operator()(const int &a, const int &b) { if(a != b) return a > b; // from large to ...
  • set> #include <string> using namespace std; struct student { int id; string name; }; struct comp//起比较作用的结构体 { bool operator()(const student &a, const student &b) { ...
  • package Collection_Set_treeSet; public class Apple implements Comparable<Apple>{ // implements Comparable<Apple>为自定义比较方法一添加 private String name; private String color; ...
  • C++中关于set自定义排序函数的书写

    万次阅读 多人点赞 2016-05-14 09:07:20
    如果说我想在set里面添加一个自定义的类型,比如说下面的结构体:struct Symbol { char name[10]; };我们如果要用set来盛放Symbol,我们应该怎么办么?set<Symbol> gSym;如果像上面这么来写的话,或许你的编译能
  • 自定义sort三种写法 1. 使用接口IComparable 2. 使用委托回调和lambad表达式 3. 使用接口IComparer 我们先定义一个学生类 public class Student { //学生的编码 public int Id { get; set; } //学生的年龄 ...
  • Java中自定义排序的几种方式

    千次阅读 2021-08-20 09:50:52
    注意,这些方法只能进行升序排序,不能自定义排序规则。想要自定义排序规则,只能将其转为Integer[]数组。 二、包装类型数组 Integer[] 对于引用类型数组,Java的Arrays类中提供了以下几种排序方法: Arrays....
  • 当对自定义类(如下面的代码)进行排序或者将自定义类放入set结构时,就需要自定义比较函数,否则会报错。对基本数据类型排序或者放入set时不需要此函数,因为是STL中自定义了比较函数,会默认调用,无需自定义。 ...
  • 主要介绍了JAVA使用Comparator接口实现自定义排序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 来自网上的一篇c++中std::set自定义去重和排序函数博文中的去重方法存在严重错误(坑害了我很久。。。。。) 其中的方法二:利用重载 < 操作符或重载 () 运算符实现自定义类的排序和去重问题,代码如下: #...
  • Map和Set本质红黑二叉树,插入数据时可以自定义比较算法,list和vector链表插入时无需比较(所以一般全部插入完成后调用sort() )核心代码: typedef struct Student { std::string name; int grade; } ...
  • 主要介绍了Java针对ArrayList自定义排序的2种实现方法,结合实例形式总结分析了Java操作ArrayList自定义排序的原理与相关实现技巧,需要的朋友可以参考下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 189,748
精华内容 75,899
关键字:

set自定义排序

友情链接: 256583.zip