C++ 在具有自定义对象的集合中查找值

C++ 在具有自定义对象的集合中查找值,c++,c++11,set,C++,C++11,Set,我有一节课 class Node{ int node; int g; int f; int parent; } 我已经创建了一个集合,其成员类型为Node set<Node, MinCost> frontier; 设置边界; 其中MinCost是用于订购的类 class MinCost { bool operator()(const Node &x, const Node &y) { return

我有一节课

class Node{
    int node;
    int g;
    int f;
    int parent;
}
我已经创建了一个集合,其成员类型为Node

set<Node, MinCost> frontier;
设置边界;
其中MinCost是用于订购的类

class MinCost
{
    bool operator()(const Node &x, const Node &y)
    {
        return x.f < y.f;
    }
};
class-MinCost
{
布尔运算符()(常量节点和x、常量节点和y)
{
返回x.f
现在,我知道一个集合必须有唯一的值。在我的集合中,Node的对象是唯一的,但其排序所依据的变量(f)可能不是唯一的

那么,找到一个对象会像预期的那样工作吗


会不会
frontier.find(Node)
返回正确的值?

我认为这对
std::set
不起作用。您可能希望使用
std::multiset
代替,并使用
equal_range()
查找具有相同成本的节点

发件人:

在标准库使用比较概念的任何地方,唯一性都是通过使用等价关系来确定的。在不精确的术语中,如果两个对象a和b的比较都不小于另一个,则认为它们是等效的:!公司(a、b)和&!薪酬(b,a)


换句话说,当您说两个
节点
对象不相等时,这与
std::set
完全无关,后者只定义了通过提供的比较定义的相等。因此,即使是插入到
std::set
中,也无法达到预期效果。

因此,如果尝试插入两个与用于排序的相同条件值匹配的节点,第二个节点将被忽略。因此,Set仅保留第一个节点。基于
MinCost
的集合将为每个对象实例具有唯一的
f
值。时期它不仅仅是一个序,它是一个严格的弱序。就你而言,这意味着如果该操作符对
(x,y)
(y,x)
都回答
false
,那么它们是等价的对象,根据集合的规则,highlander步进(只能有一个)。@Stephen,那么,如果我必须高效地找到物品,那么存储物品的最佳方式是什么呢?@AtulRamkrishnan我不清楚你的要求。如果要将所有顺序相同的节点保留在集合中,然后选择
std::multiset
,则可能需要调整逻辑以根据您的need@AtulRamkrishnan,您可以通过添加将
节点
对象插入集合、从集合中查询
节点
对象的代码来改进您的问题,并根据代码的功能提出问题。