加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读