C计算中位数参考
发布时间:2020-12-16 10:01:35 所属栏目:百科 来源:网络整理
导读:我试着计算一个叫做中位数的矢量的中位数: std::nth_element(median.begin(),median.begin() + median.size() / 2,median.end()); medianVal = median[median.size() / 2]; cout "The median is " medianVal endl; 这很好用.但我需要在其原始向量中获得中值
我试着计算一个叫做中位数的矢量的中位数:
std::nth_element(median.begin(),median.begin() + median.size() / 2,median.end()); medianVal = median[median.size() / 2]; cout << "The median is " << medianVal << endl; 这很好用.但我需要在其原始向量中获得中值的位置.我怎么能这么快做到这一点? 解决方法
我假设你不想重新订购原始容器.如果错了,有更简单的方法.
nth_element采用比较器. 所以首先在原始容器中创建一个迭代器向量,然后编写一个带有2个迭代器的比较器,对它们进行deference,amd比较结果. template<class C> auto median(C const& c){ using std::begin; using std::end; auto start = begin(c); auto finish = end(c); using iterator = decltype(start); std::vector<iterator> working; for(auto it = start; it != finish; ++it) working.push_back(it); if (working.empty()) return start; std::nth_element( begin(working),begin(working) + working.size() / 2,end(working),[](iterator lhs,iterator rhs){ return *lhs < *rhs; } ); return *(begin(working) + working.size() / 2); } 这确实依赖于一些C 14(自动返回类型推导),但是每个主要的编译器(可能除了icc?)现在都支持它. 它足够灵活,甚至可以处理C风格的数组,我认为它甚至适用于哨兵. Demo (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读