如何使用单独类的属性对向量进行 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<
。对不起:)
@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 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章