【问题标题】:Sorting A Vector Of Structs According To Contained Data根据包含的数据对结构向量进行排序
【发布时间】:2015-09-12 18:53:40
【问题描述】:

如果网站上已经存在类似问题,但我目前无法理解算法的某些部分,我很抱歉。

我有一个 Struct,其中包含有关我的游戏的用户帐户信息的信息:

struct Account
{
    int Position;
    string Name;
    int Score;
    string Date;
    int Level;

    bool operator < (User SOMETHING, User SOMETHING)
    {
         return (SOMETHING < SOMETHING);
    }
};

vector<Account> User;
User.push_back(Account());
User.push_back(Account());
User.push_back(Account());

User[0].Position=1;
User[1].Position=2;
User[2].Position=3;

sort(User.begin(), User.end(), Account);

我需要对向量的每个结构进行组织,例如,按每个包含的“位置”值的降序/升序排列。

我只需要关于 (1) bool 运算符函数(例如参数和返回值)以及 (2) 我如何拥有它以便我可以按位置、分数和级别等多个变量对其进行排序的帮助. (我需要 3 个布尔运算符函数吗?)

【问题讨论】:

    标签: c++ sorting vector struct


    【解决方案1】:

    使用std::tie,类似这样:

    struct Account
    {
        int Position;
        string Name;
        int Score;
        string Date;
        int Level;
    };
    
    bool operator < (const Account& lhs, const Account& rhs)
    {
        return std::tie(lhs.Name,lhs.Score,lhs.Date) < std::tie(rhs.Name,rhs.Score,rhs.Date);
    }
    

    将首先按照Name排序,如果Name相等则按照Score排序,当NameScore相等时按照Date排序。

    排序只需通过以下方式完成:

    std::sort(User.begin(), User.end());
    

    默认情况下,在 Account 类型的包含对象上使用 operator&lt;


    更新:我误解了你的问题。在您的情况下,您需要单独的比较器,例如

    struct by_name_ascending
    {
        bool operator()(const Account& lhs, const Account& rhs) const
        {
            return lhs.Name < rhs.Name;
        }
    };
    
    struct by_score_descending
    {
        bool operator()(const Account& lhs, const Account& rhs) const
        {
            return lhs.Score > rhs.Score;
        }
    };
    

    并对向量进行排序

    std::sort(User.begin(), User.end(), by_name_ascending());
    

    有了 lambdas,你也可以使用

    std::sort(User.begin(), User.end(),
      [](const Account& lhs, const Account& rhs){
        return lhs.Name < rhs.Name;
      }
    );
    

    直接,只需将&lt;&gt; 切换为升序/降序。类/结构本身不需要其他帮助器或运算符。

    【讨论】:

    • 我实际上需要一次按 1 个变量(位置、分数或日期)对它们进行排序 (1),以及 (2) 升序或降序。
    猜你喜欢
    • 1970-01-01
    • 2022-12-11
    • 2013-03-16
    • 2011-01-23
    • 2018-01-18
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多