如何使用单独类的属性对向量进行std::排序

How to std::sort a vector using a property of a separate class

本文关键字:std 向量 排序 何使用 单独类 属性      更新时间:2023-10-16

我有一个节点类,具有整数属性时间和std::vector<Node*> queue,其中有很多节点。我想使用std::sort函数按时间排序队列,但我不确定如何做到这一点。我知道开头是std::sort(queue.begin(), queue.end()),但我不知道第三个参数

该怎么写

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

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

这应该工作:)现场演示在这里


请注意,在提出问题之前,请查阅参考资料。这里有一个自定义比较器的例子

如果你的编译器支持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 );