【问题标题】:C++ Sorting Custom Objects in a listC ++对列表中的自定义对象进行排序
【发布时间】:2013-05-06 15:05:55
【问题描述】:

我无法对自定义类指针列表进行排序。我需要排序的类是事件。这些被分配一个随机时间,我需要以正确的顺序执行它们。

#include <list>

Class Event{
public: 
float time; // the value which I need to sort them by
int type; // to indicate which event i'm dealing with

Event(float tempTime, int tempType)
{
    time = tempTime;
    type = tempType; 
}


int main(){

std::list<Event*> EventList;
list<Event*>::iterator it;

.........

如果您能帮我解决这个问题,将不胜感激!我已经坚持了几个小时了。

谢谢!

【问题讨论】:

    标签: c++ list events sorting object


    【解决方案1】:

    由于列表包含指针而不是对象,因此您必须提供自定义比较器来比较它们指向的对象。由于您使用的是list,因此您必须使用其自己的sort 方法:通用std::sort 算法仅适用于随机访问序列。

    EventList.sort([](Event * lhs, Event * rhs) {return lhs->time < rhs->time;});
    

    或者,如果您被困在过去并且无法使用 lambda:

    struct CompareEventTime {
        bool operator()(Event * lhs, Event * rhs) {return lhs->time < rhs->time;}
    };
    
    EventList.sort(CompareEventTime());
    

    如果列表包含对象(它可能应该),那么提供一个比较运算符可能是有意义的:

    bool operator<(Event const & lhs, Event const & rhs) {return lhs.time < rhs.time;}
    
    std::list<Event> EventList;
    //...
    EventList.sort();
    

    【讨论】:

    • 非常感谢!最后一条评论让我意识到我没有任何理由使用指针。因此,我对其进行了更改并实施了您的最后一个解决方案,现在它运行良好。 (顺便说一句。最后一个解决方案确实给了我一个错误,即在运算符函数中只需要一个元素,所以我删除了 lhs 并使用 this-> 代替
    • @user2374868:是的,您可以将运算符设为具有单个参数的成员函数,而不是我的示例中的具有两个参数的非成员。
    • 对于列表,使用 List.Sort() 而不是 std::Sort() 一个小时后才意识到这一点
    • @Mike Seymour 您提到要自己定义排序函数但没有定义您只是定义了比较器函数或运算符就足够了,我想我们仍然需要包含算法库才能使用排序?对吗?
    【解决方案2】:

    您应该使用std::sort。您可以创建一个自定义比较器函数,将其作为第三个参数传递给 std::sort 函数,或者您可以为您的类创建一个 &lt; 运算符重载,std::sort 将自然而然地工作。

    【讨论】:

    • 你的意思是std::list&lt;&gt;::sort。你不能在std::list 上使用std::sort,因为它没有随机访问迭代器。
    • 我尝试过使用自定义比较器功能,但它对我不起作用。 (并使用 list.sort) j
    猜你喜欢
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    相关资源
    最近更新 更多