集查找中的精确比较

时间:2011-02-10 13:12:41

标签: c++ stl insert find set

我有一个结构(比如说Foo),它只包含字符串和一个double,我创建了一个集合,它还有一个比较器类,用于比较这些属性的子集。所以我的宣言如下:std::set<Foo, FooComp>

当我致电find()时,我希望将Foo的所有属性用作密钥或使用FooComp吗?我假设前者。

我问的原因是我遇到了一个问题,即使我尝试使用find()来检查它的存在,但在集合中未检测到先前添加的对象。我只能假设这已经发生了,因为双人可能存在微妙的差异? double属性不在比较器中使用,但可能构成密钥的一部分。

任何想法都会非常感激。

4 个答案:

答案 0 :(得分:2)

FooComp需要表示一个二进制函数,该函数对Foo进行2次引用,并确定左边的一个是否逻辑上小于右边。

struct FooComp
{
  bool operator()( const Foo& left, const Foo& right ) const;
};

并使用“严格排序”实现operator()

  • !FooComp( foo1, foo1 )
  • FooComp( foo1, foo2 ) =&gt; !FooComp( foo2, foo1 )
  • FooComp( foo1, foo2 )&amp;&amp; FooComp( foo2, foo3 ) =&gt; FooComp( foo1, foo3 )

实际上第一个公理可以从第二个公理推导出来,所以你只需要第二个和第三个公理。

答案 1 :(得分:1)

比较器将用于查找集合中的指定项目。

答案 2 :(得分:1)

比较类将用于维护set已排序和find()

答案 3 :(得分:1)

std::set::find()将使用FooComp,只要双重不构成该比较的一部分,它应该没问题。

std::find需要operator==,所以再次取决于你是否定义了这个以及包含的内容,只要它不包含double(或以合理的方式包含double),那么你很好。

因此,取决于FooComp的样子以及您调用的find ......