key_compare vs C ++中的key_comp

时间:2014-02-06 13:26:30

标签: c++ stl

假设我想对具有通用类型的set对象执行某些操作,该类型依赖于键比较器。

以下两种实现之间有什么区别吗?

template <class SetType, class KeyType>
bool CompareFirst1(SetType set, KeyType key)
{
    return typename SetType::key_compare()(*set.begin(), key);
}

template <class SetType, class KeyType>
bool CompareFirst2(SetType set, KeyType key)
{
    return set.key_comp()(*set.begin(), key);
}

2 个答案:

答案 0 :(得分:4)

是。第一个默认值构造一个新对象,该类型用作Set的比较对象。第二个返回并使用该集正在使用的比较对象的副本。

不同之处在于,如果用户在构造期间传递了比较对象,则其内部状态可能与默认构造的比较对象不同。或者甚至可能无法默认构造该对象。你想使用第二种形式。

答案 1 :(得分:2)

假设这是一个标准的关联容器,那么key_compare是比较器类型,key_comp()是一个成员函数,它返回集合的比较器对象。因此,第一个将创建该类型的新对象,该对象可能与集合中的对象不同,因此可能会给出不正确的结果。

你想使用第二个。