我有一个结构(比如说 Foo
),它只包含字符串和一个 double ,我创建了一个集合,它还有一个比较器类,用于比较这些属性的一个子集。所以我的声明看起来像:std::set<Foo, FooComp>
当我调用 find()
我会期望 Foo
的所有属性吗?用作 key 或将 FooComp
使用?我假设是前者。
我问的原因是我遇到了一个问题,即使我尝试使用 find()
也没有在集合中检测到先前添加的对象。检查它的存在。我只能假设这已经发生了,因为 double 中可能存在细微差别? double 属性未在比较器中使用,但可能构成键的一部分。
如有任何想法,我们将不胜感激。
最佳答案
FooComp 需要表示一个二元函数,它接受对 Foo 的 2 个引用,并确定左边的引用是否在逻辑上小于右边的引用。
struct FooComp
{
bool operator()( const Foo& left, const Foo& right ) const;
};
并以“严格排序”实现 operator()
!FooComp( foo1, foo1 )
FooComp( foo1, foo2 )
=>!FooComp( foo2, foo1 )
FooComp( foo1, foo2 )
&&FooComp( foo2, foo3 )
=>FooComp( foo1, foo3 )
实际上第一个公理可以从第二个公理推导出来,所以你只需要第二个和第三个公理。
关于c++ - 集合查找中的精确比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4957497/