在MyClass的一个数据成员上排序Vector <myclass>?</myclass>

时间:2013-09-03 19:59:47

标签: c++ sorting vector stl

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

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

4 个答案:

答案 0 :(得分:5)

使用std::sort有三种方法可以做到这一点。

  • operator<课程中实施MyClass功能。
  • 将函数传递给sort,其中包含两个const &MyClass引用参数,并在第一个对象小于第二个对象时返回bool true
  • 将仿函数对象(实现operator()的类)传递给sort;与独立函数一样,operator()应该使用两个const &MyClass参数并返回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());

答案 1 :(得分: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。

答案 2 :(得分: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;
});

答案 3 :(得分:0)

您可以编写比较函数并使用STL集 编写这样的比较工具:

bool operator<(MyClass other) const
{
    return (expression);
}