我有std::multiset,如果我从std::multiset::begin()迭代到std::multiset::end(),我会得到排序后的元素。除了从std::multiset::begin()迭代到std::multiset::begin() + size() / 2之外,如何获取此std::multiset中的中间元素
发布于 2015-06-05 23:37:51
下面是获取std::multiset中值的解决方案:
template<class T>
double GetMedian(const std::multiset<T>& data)
{
if (data.empty())
throw std::length_error("Cannot calculate median value for empty dataset");
const size_t n = data.size();
double median = 0;
auto iter = data.cbegin();
std::advance(iter, n / 2);
// Middle or average of two middle values
if (n % 2 == 0)
{
const auto iter2 = iter--;
median = double(*iter + *iter2) / 2; // data[n/2 - 1] AND data[n/2]
}
else
{
median = *iter;
}
return median;
}如果您需要中值绝对偏差(mdev),例如:
template<class T>
double GetMedianAbsoluteDeviation(const std::multiset<T>& data)
{
const double fMedian = GetMedian(data);
std::multiset<double> diff;
for (const auto& x : data)
{
diff.insert(std::abs(fMedian - x));
}
return GetMedian(diff);
}https://stackoverflow.com/questions/12140635
复制相似问题