C++根据引用计算中位数

标签 c++ median

我尝试计算一个名为 median 的 vector 的中位数:

std::nth_element(median.begin(), median.begin() + median.size() / 2, median.end());     
medianVal = median[median.size() / 2];  
cout << "The median is " << medianVal << endl;

这很好用。但我需要得到中值在其原始 vector 中的位置。我怎样才能非常快地做到这一点?

最佳答案

我假设您不想重新订购原始容器。如果错误,还有更简单的方法。

nth_element 采用比较器。

因此,首先在原始容器中创建一个迭代器 vector ,然后编写一个接受 2 个迭代器的比较器,对它们进行引用,然后比较结果。

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

关于C++根据引用计算中位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35324662/

相关文章:

matlab - 如何在 Matlab 中的二维扫描时间序列上应用移动中值滤波器?

C 程序不打印出值

c++ - 在 Mac OS X (El Capitan) 上安装 Cilk Plus 时出错

c++ - std::vector 插入对象的拷贝或引用?

c++ - 发送 POST 请求

python/numpy 对掩码数组(和/或选择性排名)进行二维内核排名过滤的最快方法

algorithm - 计算大型数据集中位数的内存高效方式?

c++ - 在循环中使用 cin.get() 输入字符串

c++ - 如何在MFC中分离一个CString

pandas - 使用滚动中值过滤掉 Pandas 数据框中的异常值