我在我创建的具有索引的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
。我做错了什么?
答案 0 :(得分:3)
您有一个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; }
);