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

时间:2015-06-25 23:50:30

标签: c++ sorting vector struct

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

我有一个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个bool运算符函数吗?)

1 个答案:

答案 0 :(得分:4)

使用documentation,如下所示:

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进行排序{1}}。

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

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

默认情况下,对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;
    }
};

并使用

对矢量进行排序
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;
  }
);

直接,只需将<>切换为升序/降序。在类/结构本身中不需要其他助手或操作符。