C++中的多值排序

Multiple-Value Ranking in C++

本文关键字:排序 C++      更新时间:2023-10-16

我有一个向量,它是这样的;

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