如何使用单独类的属性对向量进行 std::sort [关闭]

Posted

技术标签:

【中文标题】如何使用单独类的属性对向量进行 std::sort [关闭]【英文标题】:How to std::sort a vector using a property of a separate class [closed] 【发布时间】:2015-05-24 17:51:39 【问题描述】:

我有一个带有整数属性 Time 的 Node 类和一个 std::vector<Node*> queue,其中有很多节点。我想使用 std::sort 函数按时间对队列进行排序,但我不知道该怎么做那。我知道开头是std::sort(queue.begin(), queue.end()),但我不知道第三个参数该放什么

【问题讨论】:

“按时间排序队列”是什么意思?时间与Node有何关系? 如果队列中有 6 个节点,时间为 (1,5,88,43,25,98) 我希望队列重新排列并以 (1,5,25, 43,88,98)。而 Node 类有一个整数字段,叫做时间。 【参考方案1】:

您必须提供自定义比较器。

// comparator object
struct comparator 
    bool operator()(const Node* node1, const Node* node2) const 
        return node1->getTime() < node2->getTime();
    
;

std::vector<Node*> nodes;
//...
std::sort(nodes.begin(), nodes.end(), comparator());

// or if you can, use C++11's lambdas
std::sort(nodes.begin(), nodes.end(), [](const Node* node1, const Node* node2) 
    return node1->getTime() < node2->getTime();

这应该可行:) Live demo here


请注意,在提问之前先查看reference。那里有一个自定义比较器的示例。

【讨论】:

所以我尝试了这个。并且在表达式中的第二个“const”上有一堆错误。这有什么原因吗? 它应该是operator() 而不是operator&lt;。对不起:) @user2678799: Live demo【参考方案2】:

如果您的编译器支持 C++ 14,那么您可以简单地编写

std::sort( queue.begin(), queue.end(), 
           []( auto n1, auto n2 )  return n1->Time < n2->Time;  );

std::sort( queue.begin(), queue.end(), 
           []( const auto &n1, const auto &n2 )  return n1->Time < n2->Time;  );

否则你应该写

std::sort( queue.begin(), queue.end(), 
           []( Node *n1, Node *n2 )  return n1->Time < n2->Time;  );

std::sort( queue.begin(), queue.end(), 
           []( const Node * &n1, const Node * &n2 )  return n1->Time < n2->Time;  );

如果您的编译器不支持当前的 C++ 标准,那么您可以简单地定义一个函数

bool TimeComare(const Node *n1, const Node *n2 )

    return n1->Time < n2->Time;

然后像这样调用算法

std::sort( queue.begin(), queue.end(), TimeCompare ); 

【讨论】:

试过了,忘了说我的老师要求我们使用 C++ 98,所以我遇到了很多错误! 如果你处理指针,我想最好是按值复制然后引用(性能)。如果你处理“任何事情”,那么参考是最好的方法。 @user2678799:-试试我的回答,它使用 C++98 特性(可调用对象)。 所以使用函数而不是 lambda @user2678799 查看我更新的帖子。 @VladfromMoscow 谢谢!现在完全工作了哈哈

以上是关于如何使用单独类的属性对向量进行 std::sort [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

std :: sort不会移动向量的元素[关闭]

类指针向量上的std :: sort()

使用 std::sort 对对象向量进行排序

使用 std::sort 对具有特定标准的二维向量进行排序

C++ - 使用 std::sort 对结构向量进行排序导致读取访问冲突

使用 std::sort() 对对象向量进行排序