可以排序的std :: initializer_list

时间:2013-12-04 06:06:48

标签: c++ c++11

我想std::sort std::initializer_list;

  real_t median(const std::initializer_list<real_t> vars) {
    const unsigned x = vars.size() / 2;
    // std::sort(vars.begin(), vars.end());
    if (x & 1) {
      return *(vars.begin() + x);
    }
    return (*(vars.begin() + x) + *(vars.begin() + x + 1)) * 0.5;
  }

这给出了一个模糊的错误,我预测这是因为列表的内部元素是const &,因此它们无法排序。

对于将使用-pedantic进行编译的堆栈上的可变列表,我有哪些替代方案?

我正在使用C ++ 11。模板不是最佳的,除非它们可以针对所有参数组合进行前向实例化,或者具有可以extern的小范围。

2 个答案:

答案 0 :(得分:3)

std::initializer_listconst和{}}都不能std::sort。那是因为它的迭代器是只读的(它的迭代器类型是const T*,指向const T的指针。

要使您的功能正常工作,您必须使用满足std::sort要求的容器。可能最好的容器是std::vector

real_t median(std::vector<real_t> vars) {  // Without the const

如果你想要一个基于堆栈(固定大小)的容器,那么你可以使用std::arraystd::sort也可以。

答案 1 :(得分:1)

我有这个工作:

  template <size_t N>
  real_t median_helper(std::array<real_t, N> & vars) {
    std::sort(vars.begin(), vars.end());
    const unsigned n = vars.size() >> 1;
    if (vars.size() & 1) {
      return vars[n];
    }
    return (vars[n] + vars[n + 1]) * 0.5;
  }

  template <typename...T>
  real_t median(T const & ... args) {
    std::array<real_t, sizeof...(args)> vars = {args...};
    return median_helper(vars);
  }

使用std::array并且它在堆栈上。不幸的是,它是一个模板解决方案。