-2

我想创建一个类,称它为MyClass具有三个数据成员 - a、b 和 c。然后我希望将许多MyClass对象放入 a 中std::Vector<MyClass>,然后根据 a 数据成员对 Vector 进行排序。

有没有使用 STL 的优雅方法?我不想重新发明轮子,我相信这不会是第一次。在 Java 中,我想我会使用Comparator.

4

4 回答 4

5

有 3 种方法可以使用std::sort.

  • 在类中实现一个operator<函数。MyClass
  • 将一个函数传递给该函数,该函数sort接受两个const &MyClass引用参数,并bool true在第一个对象小于第二个对象时返回。
  • 将仿函数对象(实现 的类operator())传递给sort; 与独立函数一样,operator()应该接受两个const &MyClass参数并返回 a bool。由于对象可以具有内部状态,因此您可以使用它来动态确定要对哪个字段进行排序,或者排序应该是升序还是降序。

第一个选项:

bool MyClass::operator<(const MyClass &rhs)
{
    return a < rhs.a;
}

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

第二种选择:

bool CompareMyClass(const MyClass &lhs, const MyClass &rhs)
{
    return lhs.a < rhs.a; // this function will need to be declared friend if a is private
}

std::sort(vec.begin(), vec.end(), CompareMyClass);

第三个选项:

struct MyFunctor
{
    bool operator()(const MyClass &lhs, const MyClass &rhs) const
    {
        return lhs.a < rhs.a;
    }
};

std::sort(vec.begin(), vec.end(), MyFunctor());
于 2013-09-03T20:30:07.133 回答
3

以下应该可以解决问题:

bool operator < (MyClass const& lhs, MyClass const& rhs)
{
    return lhs.a < rhs.a;
}

std::sort 要求迭代器的 value_type 小于可比性,或者在更专业的术语中,它们必须形成严格的弱排序。鉴于上面的代码,您现在应该能够像任何其他类型一样对其进行排序:

std::sort(std::begin(my_classes), std::end(my_classes));

假设 my_classes 是一个 std::vector。

于 2013-09-03T20:06:58.047 回答
1

要创建 Java 意义上的比较器(即不属于类定义的外部比较函数),请创建一个仿函数:

struct {
    bool operator()(const MyClass& c1, const MyClass& c2) {
        return c1.a < c2.a;
    }
} my_comparator;

并将其传递给std::sort

std::sort(std::begin(my_classes), std::end(my_classes), my_comparator);

或者,如果在 C++11 上,请使用 lambda:

std::sort(my_classes.begin(), my_classes.end(), [](const MyClass& c1, const MyClass& c2) {
    return c1.a < c2.a;
});
于 2013-09-03T20:12:33.520 回答
0

您可以编写一个比较函数并使用 STL set 来编写一个比较工具,如下所示:

bool operator<(MyClass other) const
{
    return (expression);
}
于 2013-09-03T20:01:44.787 回答