std::multiset and finding the middle element

不羁的心 提交于 2020-01-13 10:44:09

问题


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


回答1:


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

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


来源:https://stackoverflow.com/questions/12140635/stdmultiset-and-finding-the-middle-element

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!