我想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
的小范围。
答案 0 :(得分:3)
std::initializer_list
(const
和{}}都不能std::sort
。那是因为它的迭代器是只读的(它的迭代器类型是const T*
,指向const
T
的指针。
要使您的功能正常工作,您必须使用满足std::sort
要求的容器。可能最好的容器是std::vector
。
real_t median(std::vector<real_t> vars) { // Without the const
如果你想要一个基于堆栈(固定大小)的容器,那么你可以使用std::array
,std::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
并且它在堆栈上。不幸的是,它是一个模板解决方案。