【问题标题】:Using #include <algorithm> to sort a vector of class objects by a string data member使用 #include <algorithm> 按字符串数据成员对类对象向量进行排序
【发布时间】:2015-05-08 03:01:01
【问题描述】:

假设我有这个类:

class cat
{
    private:
        int age;
        string name;

    public:
        cat();
        ~cat();

        void set_age(int a) { age = a; }
        void set_name(string n) { name = n; } 

        int get_age() { return age; }
        string get_name() { return name; }
}

我有一个未排序的向量,其中包含 cat 类的对象,称为 vector&lt;cat&gt; cats 或其他东西。我将如何使用算法 STL 按名称对它们进行排序?

【问题讨论】:

  • 你有什么不明白的地方?你读过一些文档吗?网络上肯定有一百万个例子。
  • 问题一经发布并收集到答案,请不要从根本上改变问题。

标签: c++ algorithm stl


【解决方案1】:

该函数实现“小于”排序。它需要两个任意元素,并返回两者中较小的一个。容器的内部算法使用它来创建排序。

不得不说,这点std::sort's documentation说的很清楚了:

comp: 比较函数对象(即满足比较要求的对象),如果第一个参数小于,则返回​true(即有序之前)第二个。

比较函数的签名应该等价于:

bool cmp(const Type1 &a, const Type2 &b);

所以我不确定你在纠结什么?你没说。

【讨论】:

  • 我想我很好奇当您尝试排序的数据类型是字符串时它是如何工作的。我很抱歉。如果只是a &lt; b 类型的比较,它还会按字母顺序排序吗?
  • @Jordan:这完全取决于你!您正在编写函数,因此您定义了排序。这就是为什么您可以自己定义它的原因。如果您的“容器”是string,那么您正在定义一个对chars 的排序。好吧,只要你遵守严格的弱排序。你在用哪本书?
【解决方案2】:

更新:现在您已将问题从如何按年龄排序更改为如何按姓名排序...我假设您可以修改下面的代码。

可以这么简单

std::sort(std::begin(cats), std::end(cats),
          [](const cat& x, const cat& y)
          { return x.get_age() < y.get_age(); });

但是如果 - 就像在现实世界中一样 - 猫可能有相同的年龄 - 依靠其他一些标准来确定哪个“更少” - 在你的情况下,唯一的选择是 name,所以:

std::sort(std::begin(cats), std::end(cats),
          [](const cat& x, const cat& y)
          { return x.get_age() < y.get_age() ||
                   x.get_age() == y.get_age() && x.get_name() < y.get_name(); });

第三个参数是排序函数,表示第一个参数 - 以上x - 是否小于第二个参数 - y。我使用了一个内联 lambda 函数,从 C++11 开始就支持它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    相关资源
    最近更新 更多