C++ 排序向量<;MyClass>;在MyClass';s数据成员?

C++ 排序向量<;MyClass>;在MyClass';s数据成员?,c++,sorting,vector,stl,C++,Sorting,Vector,Stl,我想创建一个类,称之为MyClass,它有三个数据成员-a、b和c。然后,我希望将许多MyClass对象放入std::Vector中,然后根据a数据成员对向量进行排序 使用STL有没有一种优雅的方法?我不想重新发明轮子,我相信这不会是第一次。在Java中,我想我会使用一个比较器您可以编写一个比较函数并使用STL集 要像这样编写比较实现,请执行以下操作: bool operator<(MyClass other) const { return (expression); } boo

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


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

您可以编写一个比较函数并使用STL集 要像这样编写比较实现,请执行以下操作:

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

bool操作符以下操作应该可以完成:

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

假设my_类是std::vector。

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

struct {
    bool operator()(const MyClass& c1, const MyClass& c2) {
        return c1.a < c2.a;
    }
} my_comparator;
或者,如果在C++11上,请使用lambda:

std::sort(my_classes.begin(), my_classes.end(), [](const MyClass& c1, const MyClass& c2) {
    return c1.a < c2.a;
});
std::sort(my_classes.begin()、my_classes.end()、[](常量MyClass&c1、常量MyClass&c2){
返回c1.a
使用
std::sort
有三种方法


  • 实现一个
    操作您只需要实现
    operator@RetiredNinjamyvector.Sort()不会知道任何有关运算符的信息,也不会知道任何
    myvector.Sort()
    ,除非您没有使用
    std::vector
    @user997112:它不需要“知道”;C++的工作方式是,操作符将被简单地找到。请记住,标准库代码位于用户空间中,因此它与您自己的代码受所有相同规则的约束。如果匹配的
    operator@user997112(继续)考虑编写<代码>模板无效的fo(t t){bar(t);}不需要知道对于<代码> BAR < />代码有哪些重载可用。如果有,它将被使用。如果没有,您将得到一个重载解析失败错误。如果有多个,您将得到一个歧义错误。编写库的人不在乎——由你来提供实现,一旦你做的一切都很好。或者做同样的事情,但适当地缩进。谢谢你的精确回答。没问题。很高兴我能帮助你。
    
    std::sort(std::begin(my_classes), std::end(my_classes), my_comparator);
    
    std::sort(my_classes.begin(), my_classes.end(), [](const MyClass& c1, const MyClass& c2) {
        return c1.a < c2.a;
    });
    
    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());