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());