根据包含的数据排序结构的矢量

Don*_*ald 5 c++ sorting struct vector

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

我有一个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);
Run Code Online (Sandbox Code Playgroud)

我需要组织我的矢量的每个结构,例如,按照每个包含的"位置"值的降序/升序排列.

我只需要帮助(1)bool操作符函数(例如参数和返回值),以及(2)我如何拥有它以便我可以通过多个变量(如位置,分数和级别)对其进行排序.(我需要有3个bool操作符函数吗?)

Dan*_*rey 4

使用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);
}
Run Code Online (Sandbox Code Playgroud)

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

排序简单地通过以下方式完成:

std::sort(User.begin(), User.end());
Run Code Online (Sandbox Code Playgroud)

默认情况下,它使用operator<类型为包含的对象Account


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

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;
    }
};
Run Code Online (Sandbox Code Playgroud)

并对向量进行排序

std::sort(User.begin(), User.end(), by_name_ascending());
Run Code Online (Sandbox Code Playgroud)

对于 lambda,您还可以使用

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

直接、简单地切换<>升序/降序。类/结构本身不需要其他帮助器或运算符。