std::min_element 从类对象返回意外结果
std::min_element returning unexpected result from class objects
我在我创建的这个具有索引的 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; }
);
相关文章:
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- 如何访问从 COM 对象返回的 VARIANT 数据类型中的安全数组C++?
- 从我的对象返回静态数组
- 将unique_ptr作为<Object>unique_ptr<常量对象返回>
- 从右值对象返回成员
- 视觉对象 返回 C++ 中的双精度值
- 为什么类型为 sf::Text 的对象返回不同的 getPosition().y 和 getLocalBounds().
- std::min_element 从类对象返回意外结果
- C++无效的对象返回语义
- const引用是否延长临时对象返回的临时对象的寿命
- 将 NULL 作为对象返回时未收到任何警告
- 如何在 C# 中从 com 对象返回数组(double[])
- 从重载运算符返回引用,并使用临时对象返回表达式
- Cin 对象返回值 c++
- 将变量作为类对象返回
- 使用可更改对象返回只读的最佳方法是什么
- 如何在Cython中从另一个包装对象返回包装的c++对象
- 当对象返回时,c++动态数组被清除
- 从带有动态字段的函数、对象返回
- 从堆栈上的匿名对象返回对*this的引用