以模板为函数参数的 C++ 自定义比较函数

Posted

技术标签:

【中文标题】以模板为函数参数的 C++ 自定义比较函数【英文标题】:C++ Custom Comparison Function with Template as Function Parameter 【发布时间】:2013-05-02 15:05:26 【问题描述】:

我正在尝试实现/使用比较器样式接口,就像您在 Java 中找到的那样,它允许我将通用比较器类型传递给函数并使用它对数据集进行排序。

这是因为我需要各种不同的比较函数,并且我希望能够将我需要的一个传递给排序函数。

这是我目前所拥有的代码 sn-p,希望你能明白我的意思:

void Population::sort(const std::shared_ptr<Comparator<Solution>>& comparator)

    std::sort(data.begin(), data.end(), comparator.get());

以及我尝试实现的比较器接口

template <typename T> class Comparator : public std::binary_function<T,T,bool>

public:
    virtual ~Comparator ();
    virtual bool operator() ( const T &o1, const T &o2  ) = 0;
;

这可能很明显我做错了,因为我不太了解 C++。

干杯!

【问题讨论】:

我认为你在设计这个。比较器中的虚方法,您很可能可以在调用方的仿函数实例中使用std::reference_wrapper 【参考方案1】:

除非您明确需要在运行时更改比较谓词,否则我会选择将 Population::sort 函数设为模板函数:

struct Person

    std::vector<int> v;

    template<typename P>
    void sort(P& p)
    
        std::sort(v.begin(), v.end(), p);
    
;

这为您的谓词提供了广泛的选项。如:

bool mycompare(int a, int b)

    return a < b;


struct predicate

    bool operator()(int a, int b)
    
        return a < b;
    
;

struct myclass

    bool function(int a, int b)
    
        return a < b;
        
;

int main()


    Person p;

    // you can use a lambda
    p.sort([](int a, int b)return a < b;);
    // you can use a functor
    predicate pred;
    p.sort(pred);
    // you can use a free function
    p.sort(mycompare);
    // you can bind to a class member function
    myclass c;
    p.sort(std::bind(&myclass::function, &c, std::placeholders::_1, std::placeholders::_2));
    std::copy(p.v.begin(), p.v.end(), std::ostream_iterator<int>(std::cout));

使用这样的模板函数具有很大的灵活性。

【讨论】:

完美!非常感谢您的帮助以及花时间详细说明替代方案。【参考方案2】:

首先:您应该正确实施比较器。比如:

template <typename T>
struct Comparator : public std::binary_function<T,T,bool>

    bool operator()(const T& o1, const T& o2)
    
        return o1 < o2;
    

第二:你应该把你的比较器的实例放到 std::sort:

std::sort(data.begin(), data.end(), Comparator<Solution>());

【讨论】:

但这是否意味着我不能覆盖它,因为它不再是虚拟的?另外我希望能够将比较器作为参数传递给排序函数,但我认为我不能那样做? 为什么要覆盖它?你总是可以对你的模板类做具体的实现。 std::sort 将比较(二进制函数)作为第三个参数,因此您应该创建一个比较器的实例以将其传递给排序函数

以上是关于以模板为函数参数的 C++ 自定义比较函数的主要内容,如果未能解决你的问题,请参考以下文章

为啥c++的set容器的自定义比较函数要用一个结构体重载()符

C++ STL中SORT的自定义比较函数?

C++中的()操作符重载及STL传递比较函数

C++学习35 模板中的函数式参数

C++中得sort函数的比较函数(第三个参数)为什么要声明为static

C++ std::map sort 如何按值排序 自定义比较函数 比较对象某个字段