【问题标题】:Finding value in a set with custom objects使用自定义对象在集合中寻找价值
【发布时间】:2018-05-25 18:50:53
【问题描述】:

我有课

class Node{
    int node;
    int g;
    int f;
    int parent;
}

我创建了一个包含节点类型成员的集合

set<Node, MinCost> frontier;

其中 MinCost 是 Ordering 的类

class MinCost
{
    bool operator()(const Node &x, const Node &y)
    {
        return x.f < y.f;
    }
};

现在,我知道集合必须具有唯一值。在我的集合中,Node 的对象是唯一的,但对其排序的变量 (f) 可能不是。

那么,找到一个对象会按预期工作吗?

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

【问题讨论】:

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

标签: c++ c++11 set


【解决方案1】:

我认为这不适用于std::set。您可能希望改用std::multiset 并使用equal_range() 来查找成本相同的节点。

来自cppreference

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

换句话说,当您说两个Node 对象不相等时,这与std::set 完全无关,std::set 只定义了提供的比较所定义的相等性。因此,即使插入 std::set 也不会达到您的预期。

【讨论】:

    猜你喜欢
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    相关资源
    最近更新 更多