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