对 MyClass 的数据成员之一的 Vector<MyClass> 排序? [复制]

Posted

技术标签:

【中文标题】对 MyClass 的数据成员之一的 Vector<MyClass> 排序? [复制]【英文标题】:Sort Vector<MyClass> on one of MyClass's data members? [duplicate] 【发布时间】:2013-09-03 19:59:47 【问题描述】:

我想创建一个类,命名为MyClass,它有三个数据成员——a、b 和 c。然后我希望将许多 MyClass 对象放入 std::Vector&lt;MyClass&gt; 中,然后根据 a 数据成员对 Vector 进行排序。

有没有使用 STL 的优雅方式来做到这一点?我不想重新发明***,我相信这不会是第一次。在 Java 中,我想我会使用 Comparator

【问题讨论】:

你只需要实现operator&lt;() @RetiredNinja myvector.Sort() 肯定不会知道关于 operator 没有myvector.Sort(),除非你没有使用std::vector @user997112:不需要“知道”; C++ 的工作方式是简单地找到运算符。请记住,标准库代码位于用户空间中,因此它与您自己的代码受所有相同规则的约束。如果范围内存在匹配的operator&lt;,则将使用它;为您的平台写 std::vector 的人不知道您会这样做并不重要。 @user997112: (续) 想想写template &lt;typename T&gt; void foo(T t) bar(t); 的人如何不需要知道bar 可以使用哪些重载。有的话就用。如果没有,您将收到重载解析失败错误。如果有多个,则会出现歧义错误。编写库的人不在乎——由您来提供该实现,一旦您完成,一切都会很好。 【参考方案1】:

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

MyClass 类中实现operator&lt; 函数。 向sort 传递一个函数,该函数接受两个const &amp;MyClass 引用参数,并在第一个对象小于第二个对象时返回bool true。 将函子对象(实现operator()的类)传递给sort;与独立函数一样,operator() 应该接受两个const &amp;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());

【讨论】:

【参考方案2】:

以下应该可以解决问题:

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。

【讨论】:

感谢您的准确回答 没问题。很高兴能帮到你。【参考方案3】:

要创建 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;
);

【讨论】:

【参考方案4】:

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

bool operator<(MyClass other) const

    return (expression);

【讨论】:

或者做同样的事情但是正确缩进。

以上是关于对 MyClass 的数据成员之一的 Vector<MyClass> 排序? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

具有成员 std::vector 的移动语义

c++11的std::thread能用类的成员函数构造一个线程吗?语法怎样?

std::vector<MyClass*> 的 VBO 和正确的步幅

std::vector 类与非成员函数(连同 typedef)[关闭]

具有引用数据成员的类的默认构造函数?

如何根据已排序索引的向量对 std::set 索引进行排序?