std::multiset并查找中间元素
std::multiset and finding the middle element
我有std::multiset
,如果我从std::multiset::begin()
迭代到std::multiset::end()
,我将获得排序的元素。除了从std::multiset::begin()
迭代到std::multiset::begin() + size() / 2
之外,我如何获得该std::multiset
中的中间元素?
以下是获取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);
}
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 2D数组来自文本输入,中间有空格
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 如何输入数组的元素,每次获得新元素时,我们将其放在数组的中间?
- C++:我可以重用/移动 std::list 元素从中间到结尾吗?
- 如何使用第一个、中间和最后一个元素的中位数正确分区?
- 使用 std::move 在开始时插入矢量的中间元素不起作用
- 当中间元素选择为枢轴时,快速排序C 不起作用
- 将元素插入到中间的矢量中
- 如何更改元素中间的文本样式
- std::multiset并查找中间元素
- 在合并排序中选择中间元素
- 删除单链表中间的元素
- 从中间删除元素的最佳数据结构是什么
- TinyXML2 -在XML中间插入元素
- 使用中间元素作为透视C++计算快速排序中的比较数
- 对于可移动类型,删除std::向量中间的元素仍然很昂贵吗
- 如何找到地图的中间元素??STL