使用C中的自定义比较函数初始化多集

前端之家收集整理的这篇文章主要介绍了使用C中的自定义比较函数初始化多集前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
考虑以下比较功能
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;

猜你在找的C&C++相关文章