gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:39:33 25 4
gpt4 key购买 nike

我在我创建的这个具有索引的 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按值(value)计算,一切都会正常工作。

另请注意 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; }
);

关于c++ - std::min_element 从类对象返回意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29736062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com