std::multiset 并找到中间元素 [英] std::multiset and finding the middle element

查看:24
本文介绍了std::multiset 并找到中间元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有 std::multiset 如果我从 std::multiset::begin() 迭代到 std::multiset::end() 我会得到排序的元素.除了从 std::multiset::begin() 迭代到 std::multiset:: 之外,我如何获得此 std::multiset 中的中间元素开始() + 大小()/2

I have std::multiset which If i iterate over from std::multiset::begin() to std::multiset::end() i will get sorted elements. How Do I get the middle element in this std::multiset other than iterating from std::multiset::begin() to std::multiset::begin() + size() / 2

推荐答案

这里是获取 std::multiset 中值的解决方案:

Here is a solution to get median value for 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),例如:

And if you need median absolute deviation (mdev) for example:

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);
}

这篇关于std::multiset 并找到中间元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆