std::min_element 从类对象返回意外结果

std::min_element returning unexpected result from class objects

本文关键字:对象 返回 结果 意外 min element std      更新时间:2023-10-16

我在我创建的这个具有索引的 Node 对象上使用 std::min_element。我有一个 std::set 容器,其中包含 10 个具有不同索引的节点,然后我调用 std::min_element 来获取索引号最低的节点。

#include <iostream>
#include <string>
#include <algorithm>
#include <set>
using namespace std;
class Node
{
public:
    Node(int index) : _index(index) {}
    int index() const { return _index; }
    inline bool operator< (const Node &right) { return this->index() < right.index(); }
private:
    int _index;
};
int main()
{
    set<Node*> s;
    for(int i = 10; i > 0; i--) //10 , 9 , 8 ...
        s.insert(new Node(i));
    Node *lowest = *min_element(s.begin(), s.end());
    cout << lowest->index() << endl;
    //free
    for(set<Node*>::iterator iter = s.begin(); iter != s.end(); iter++)
        delete *iter;
    system("pause");
    return 0;
}

输出10但肯定是1.我做错了什么?

您有一个set<Node*>,而不是set<Node>。所以它使用的是标准指针operator<,而不是你定义的指针。如果将类型更改为 set<Node> 并按值添加Node,则一切正常。

另请注意,set<T> 已经按 operator< 排序,因此如果您有:

std::set<Node> nodes;
// add nodes here
Node& lowest = *nodes.begin();

您不必使用min_element.如果您在vector中搜索,该算法将更有用:

std::vector<Node*> nodes;
// add nodes here
auto it = std::min_element(std::begin(nodes), std::end(nodes),
    [](Node* a, Node* b){ return *a < *b; }
);