C ++自定义比较函数,模板作为函数参数

时间:2013-05-02 15:05:26

标签: c++ templates sorting vector comparator

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

这是因为我需要各种不同的比较函数,我希望能够将我需要的函数传递给sort函数。

这是我到目前为止的代码片段,希望你能说出我的意思:

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 ++,所以我做错了。

干杯!

2 个答案:

答案 0 :(得分:2)

除非你明确需要在运行时更改比较谓词,否则我会选择使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));
}

使用这样的模板函数可以提供很大的灵活性。

答案 1 :(得分:0)

首先:你应该正确实施你的比较器。类似的东西:

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>());