使用自定义对象查找集合中的值

时间:2018-05-25 18:50:53

标签: c++ c++11 set

我有一个班级

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

我已经创建了一个包含Node

类型成员的集合
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)会返回正确的值吗?

1 个答案:

答案 0 :(得分:0)

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

来自cppreference

  

标准库的所有地方都使用Compare概念,唯一性由等价关系决定。在不精确的术语中,如果两个对象的比较小于另一个,则认为两个对象a和b是等价的:!comp(a,b)&amp;&amp; !comp(b,a)。

换句话说,当你说两个Node个对象不相等时,这与std::set完全无关,std::set只定义了由提供的比较定义的相等性。因此,即使插入public String lookFor(String inputWord, String[] dictionary) { Arrays.sort(dictionary); for (int index = dictionary.length - 1; index > 0; index--) { if (isTheWordASubsequence(inputWord, dictionary[index])) return dictionary[index]; } return null; } private boolean isTheWordASubsequence(String inputWord, String dictionaryWord) { int spot = 0; int offset = 0; for (char item : dictionaryWord.toCharArray()) { spot = (offset = inputWord.indexOf(item, spot)) >= spot ? offset : -1; if (spot < 0) return false; } return true; } 也不会达到预期效果。