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
我有一个这样的向量;
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