C++中的多值排序
Multiple-Value Ranking in C++
我有一个向量,它是这样的;
vector<pair<Point, vector<double> > >
[点(x,y)],[双值1|双值2|…|双值N]
我想做的是根据每个值对这个向量进行排序,然后计算向量中每个元素的平均秩。平均值最高的元素将获胜。
通过一个简单的方法,我想我可以创建向量对,这样;
vector<pair<Point(x,y), double value1> >
vector<pair<Point(x,y), double value2> >
...
vector<pair<Point(x,y), double valueN> >
然后对每个向量进行排序,存储秩等,同时根据点(x,y)保留唯一的ID。然而,我想知道的是,使用C++和Boost是否有更优雅的方法?
我建议使用一个自定义结构:
struct Point { int x, y; };
template <size_t N = 3>
struct Entry {
Point at;
std::array<double, N> data;
double rank() const {
return algo::average(data.begin(), data.end());
}
};
并像使用nth_element
:一样使用它
#include <numeric>
#include <iterator>
namespace algo {
template <typename R = double, typename It>
R average(It b, It e) {
return std::accumulate(b, e, R{}) / std::distance(b,e);
}
}
// ...
struct ByRankDescending {
template<typename Entry>
double operator()(Entry const& a, Entry const& b) const {
return a.rank() > b.rank();
}
};
#include <vector>
#include <iostream>
#include <algorithm>
int main() {
std::vector<Entry<3>> entries {
{ Point{1,2}, {3,4,5} },
{ Point{3,4}, {5,6,7} },
{ Point{5,6}, {7,8,9} },
};
if (!entries.empty()) {
std::nth_element(entries.begin(), entries.begin()+1, entries.end(), ByRankDescending{});
std::cout << "Max. rank at " << entries.front().at.x << ", " << entries.front().at.y << "n";
}
}
打印:
Max. rank at 5, 6
相关文章:
- 二叉排序树无法编译
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- C++选择排序算法中的逻辑错误
- 使用C++程序合并排序没有得到正确的输出
- 计算排序向量的向量中唯一值的计数
- 排序算法c++
- 使用2个键的cpp-stl::优先级队列排序不正确
- 将结构向量排序为子组
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 如何对点云数据进行排序
- 对字符串进行排序时,在c++中处理sort()
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 下面是排序算法O(n)吗
- std::sort()函数无法对向量的一部分进行排序
- shell排序中的交换和比较
- clang格式:禁用排序包含
- 显示错误输出的简单数组排序程序
- 为什么我的排序算法会更改数组值
- 试图在c++中对数字列表进行排序
- 如何在C++中对数组进行冒泡排序