受比较者约束的数据结构

时间:2016-10-01 21:53:05

标签: c++ templates c++11 dictionary

我已经定义了一个类,它维护着一个到其他数据结构的双打映射的有序映射。根据用例,我希望其他用户按升序或降序排列。

struct Book {
  std::map<double, Level> levels;

  // More complexity ...

  void process(Tick &t);

  const unsigned amount;

  // More stuf ...

  Book(const unsigned amount) :  levels(), id_price() {}

};

理想情况下,这应该在Book的构造函数中指定。我可以传递std::less<double>(),但这不起作用,因为我不能使用变量来声明地图levels,对吧?它适用于模板吗?我不想让它成为通用类型。不应该增加不必要的复杂性应该是双倍的。想法?

2 个答案:

答案 0 :(得分:3)

您可以按以下方式定义自定义比较器:

class comparator {

public:

      bool descending;

      comparator(bool descending) : descending(descending) {}

      bool operator()(double a, double b) const
      {
            return descending ? b < a:a < b;
      }
};

然后,在您的班级中,定义指定此比较器类的地图:

std::map<double, Level, comparator> levels;

然后,您的构造函数需要显式初始化此比较器,并使用它来初始化您的类的映射。 std::map的构造函数接受一个可选参数,该参数传递地图将使用的比较器类的实例。然后,对于Book的每个实例,其构造函数可以指定对levels进行排序的方式。

P.S。 doublepoor choice for a map key,但这是一个不同的问题。

答案 1 :(得分:2)

您可以定义地图以使用自定义比较器

struct Compare
{
    bool operator()(double l, double r) const {
        return cmp(l, r);
    }

    std::function<bool(double, double)> cmp;
};

然后您将地图定义如下:

std::map<double, Level, Compare> levels;

和构造函数

template<typename T>
Book(T comparator) :  levels(Compare{comparator}) {}

然后你可以用你想要的任何比较器初始化地图

Book a(std::less<>{});

如果你不想要std::function的开销,你可以在比较器中实现更严格的逻辑。