我有一个结构(比如说Foo
),它只包含字符串和一个double,我创建了一个集合,它还有一个比较器类,用于比较这些属性的子集。所以我的宣言如下:std::set<Foo, FooComp>
当我致电find()
时,我希望将Foo
的所有属性用作密钥或使用FooComp
吗?我假设前者。
我问的原因是我遇到了一个问题,即使我尝试使用find()
来检查它的存在,但在集合中未检测到先前添加的对象。我只能假设这已经发生了,因为双人可能存在微妙的差异? double属性不在比较器中使用,但可能构成密钥的一部分。
任何想法都会非常感激。
答案 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
......