C++ 具有多个成员的排序结构c++;

C++ 具有多个成员的排序结构c++;,c++,class,sorting,structure,C++,Class,Sorting,Structure,我想对一类“歌曲”数据类型进行排序 class song{ std::string artist; std::string title; std::string size; public: }; 我知道可以使用bool操作符重载>,但如果我想让它按艺术家、标题、大小排序,有没有办法指定比较顺序?当您创建操作符时,您想重载操作符 bool operator<(const song& x, const song& y) { if (x.artist

我想对一类“歌曲”数据类型进行排序

class song{
  std::string artist;
  std::string title;
  std::string size;

  public:
};

我知道可以使用bool操作符重载>,但如果我想让它按艺术家、标题、大小排序,有没有办法指定比较顺序?

当您创建
操作符时,您想重载
操作符

bool operator<(const song& x, const song& y)
{
    if (x.artist < y.artist)
        return true;
    if (x.artist > y.artist)
        return false;
    if (x.title < y.title)
        return true;
    if (x.title > y.title)
        return false;
    if (x.size < y.size)
        return true;
    if (x.size > y.size)
        return false;
    return false;
}
bool操作符y.artist)
返回false;
如果(x.titley.title)
返回false;
如果(x尺寸y尺寸)
返回false;
返回false;
}

这方面有很多变化,但这对我来说是可行的。

有两种解决方案,要么你有某种全局变量[或类似的]可以在
操作符>
函数中访问,要么你使用带有“compare function”参数的
sort

第二种解决方案如下所示:

class song
{
    .... 
    static compareArtist(const song &a, const song &b)
    {
        return a.artist > b.artist;
    }
    static compareTitle(const song &a, const song &b)
    {
        return a.title > b.title;
    }
 ... 
}

if (sortby == artist)
   sort(songs.begin(), songs.end(), song::compareArtist);
else if (sortby == title)
   sort(songs.begin(), songs.end(), song::compareTitle);

每个人似乎都认为您需要基于多个属性的常量排序。将“then”解释为您希望在不同的时间根据不同的属性进行排序,以下是一个答案:

可以将std::sort与lambda一起使用

std::sort(songs.begin(), songs.end(), 
[](const Song& s1, const Song& s2)  
{
    // any comparison code you want.
    return result;
});

由于您将实现
的重载是,您可以在
操作符中指定它谢谢,是的,我不允许使用boost,不幸的是,因为它是用于学校的,但是c++11应该可以,只要我指定。你知道如果我安装了c++11库和编译器,我会如何在linux上检查吗?实际上,有效的变体很少。这种比较器必须遵守严格的弱序原则。幸运的是,据我所知,你的是。
std::sort(songs.begin(), songs.end(), 
[](const Song& s1, const Song& s2)  
{
    // any comparison code you want.
    return result;
});