C++之set自定义排序问题

 更新时间:2023年11月08日 09:20:14   作者:沧海漂游_  
这篇文章主要介绍了C++之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;
}

运行结果如下:


这里写图片描述

方法二 重载()

示例代码如下:

#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 效果也是一样的。

insert 和 emplace 的使用

emplace对应insert,emplace_back对应于push_back;

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • for循环中删除map中的元素valgrind检测提示error:Invalid read of size 8

    for循环中删除map中的元素valgrind检测提示error:Invalid read of size 8

    这篇文章主要介绍了for循环中删除map中的元素valgrind检测提示error:Invalid read of size 8 的相关资料,需要的朋友可以参考下
    2016-07-07
  • c++ string的erase删除方法

    c++ string的erase删除方法

    这篇文章主要介绍了c++ string的erase删除方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 详解C++实现匈牙利算法

    详解C++实现匈牙利算法

    匈牙利算法是一种在多项式时间内求解任务分配问题的组合优化算法,并推动了后来的原始对偶方法。美国数学家哈罗德·库恩于1955年提出该算法。此算法之所以被称作匈牙利算法,是因为算法很大一部分是基于以前匈牙利数学家Dénes K&#337;nig和Jen&#337; Egerváry的工作之上创建起来的
    2021-06-06
  • C++基于递归和非递归算法求二叉树镜像的方法

    C++基于递归和非递归算法求二叉树镜像的方法

    这篇文章主要介绍了C++基于递归和非递归算法求二叉树镜像的方法,针对二叉树遍历结合实例形式分析了递归与非递归算法的实现与使用技巧,需要的朋友可以参考下
    2017-05-05
  • C++中重载、重写(覆盖)和隐藏的区别实例分析

    C++中重载、重写(覆盖)和隐藏的区别实例分析

    这篇文章主要介绍了C++中重载、重写(覆盖)和隐藏的区别,是C++面向对象程序设计非常重要的概念,需要的朋友可以参考下
    2014-08-08
  • C语言单链表实现多项式相加

    C语言单链表实现多项式相加

    这篇文章主要为大家详细介绍了C语言单链表实现多项式相加,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • C语言实现扫雷游戏(可展开)

    C语言实现扫雷游戏(可展开)

    这篇文章主要为大家详细介绍了C语言实现扫雷游戏,实现扫雷展开和提醒,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • C++ 智能指针代码解析

    C++ 智能指针代码解析

    这篇文章主要介绍了c++ 智能指针基础的相关资料,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下,希望能给你带来帮助
    2021-10-10
  • QT中QByteArray与char、int、float之间的互相转化

    QT中QByteArray与char、int、float之间的互相转化

    本文主要介绍了QT中QByteArray与char、int、float之间的互相转化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • C语言实现的统计php代码行数功能源码(支持文件夹、多目录)

    C语言实现的统计php代码行数功能源码(支持文件夹、多目录)

    这篇文章主要介绍了C语言实现的统计php代码行数功能源码,支持文件夹、多级目录的统计,在一些环境中会用到这个功能,需要的朋友可以参考下
    2014-08-08

最新评论