C ++ STL比较类:如何参数化comp-class行为?

时间:2011-03-28 02:01:02

标签: c++ boost stl c++11 priority-queue

我想使用带有自定义数据类型和几个比较标准的std :: priority_queue容器(我为每个容器定义了一个仿函数;它们中的每个都处理相同的类型)。 使用的比较标准本身应该可以通过函数参数进行配置(避免队列的if_then_初始化)。

基于this post,据我所知,使用比较函子,它本身用一个定义的比较函数之一的函数指针初始化,我试图使用一个可配置的比较函子,用另一个比较函子初始化(然后在本地存储并在调用时使用)。我还没把它上班。

我甚至不知道是否有可能做我想要的一般事情。我不知道我是否对类型做了错误(我使用了typedef boost :: function xxx)或者需要额外的C ++ 0x功能(“闭包”有帮助吗?)。

所以基本上我想要有类似下面这样的东西(这不会用非长但是很丑的错误编译; GCC 4.5):

#include <iostream>
#include <queue>
#include <boost/tuple/tuple.hpp>
#include <boost/function.hpp>

typedef boost::tuple<double, int> custom_type;  // example only!
typedef boost::function<bool (const custom_type & l, const custom_type & r)> comp_type; // comparison functor

struct fifo_comp
{
    bool operator() (const custom_type & l, const custom_type & r) const
    {
        // compare only id
        return l.get<1>() > r.get<1>();
    }
};

struct lifo_comp
{
    bool operator() (const custom_type & l, const custom_type & r)
    {
        // compare only id
        return l.get<1>() < r.get<1>();
    }
};

class Compare
{
    public:
        explicit Compare(const comp_type & comp);

        bool operator() (const custom_type & l, const custom_type & r)
        {
            return comp(l, r);
        }

    private:
        const comp_type & comp;
};

class Some_Class_Using_Queue
{
public:
    Some_Class_Using_Queue(comp_type & comp) : pqueue(Compare(comp)) {}

    void test()
    {
        pqueue.push(custom_type(1.0, 1));
    }

private:
    std::priority_queue<custom_type, std::vector<custom_type>, Compare> pqueue;
};

int main()
{
    comp_type f = fifo_comp();
    Some_Class_Using_Queue temp((f));    // critical
    temp.test();
    return 1;
}
  • 有什么帮助让它为我工作(鼓励使用STL / Boost)?
  • 任何更好的想法(完全不同)?
  • 这里有没有很酷的C ++ 0x功能(可能是关闭)?

谢谢。

PS / Edit:我知道,使用模板调用类并使用适当的comp-class作为template-param调用类是可能的,也很容易。但我不知道这是否是一个更好的方法(关于设计)。使用这种方法,我必须在调用之前切换/ if-else,因为模板参数需要在编译时可用。

PS:我设置了“priority_queue”标记,即使问题可能完全独立于此适配器类。如果有人想删除它,那就去做吧。

1 个答案:

答案 0 :(得分:2)

您缺少Compare构造函数的定义:

explicit Compare(const comp_type & comp) : comp(comp) { }

除此之外,它为我构建并运行。

此外,Compare似乎是多余的。它只是用相同的接口包装comp_type。在删除Compare类并将其替换为comp_type之后,代码仍会构建并运行。