考虑以下比较功能:
bool compare(std::shared_ptr<myObject> &lhs,std::shared_ptr<myObject> &rhs){ return lhs->value < rhs->value; }
现在的想法是初始化std :: shared_ptr< myObject>类型的多集合.订购具有上述功能的元素.所以从我读过的书中应该这样做:
std::multiset<std::shared_ptr<myObject>,decltype(compare)*> myset{compare};
题:
我的问题是,在声明中我简单地传递了一个函数指针来引用比较函数,但为什么我们使用{compare}来启动集合?它的重要性是什么?为什么有必要这样做?
解决方法
因为该集需要比较仿函数才能使用.如果你没有指定一个,它将构成一个默认构造的.在这种情况下,由于您使用的是函数指针类型,因此默认构造的类型将是一个无法调用的空指针;所以相反,你必须在运行时提供正确的函数指针.
更好的方法可能是使用函数类类型(a.k.a. functor类型);然后可以在编译时解析函数调用,并且默认构造的对象将执行正确的操作:
struct compare { bool operator()(std::shared_ptr<myObject> &lhs,std::shared_ptr<myObject> &rhs) const { return lhs->value < rhs->value; } }; std::multiset<std::shared_ptr<myObject>,compare> myset;