假设我想对具有通用类型的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);
}
答案 0 :(得分:4)
是。第一个默认值构造一个新对象,该类型用作Set的比较对象。第二个返回并使用该集正在使用的比较对象的副本。
不同之处在于,如果用户在构造期间传递了比较对象,则其内部状态可能与默认构造的比较对象不同。或者甚至可能无法默认构造该对象。你想使用第二种形式。
答案 1 :(得分:2)
假设这是一个标准的关联容器,那么key_compare
是比较器类型,key_comp()
是一个成员函数,它返回集合的比较器对象。因此,第一个将创建该类型的新对象,该对象可能与集合中的对象不同,因此可能会给出不正确的结果。
你想使用第二个。