gpt4 book ai didi

c++ - C++ 中的多值排序

转载 作者:太空宇宙 更新时间:2023-11-04 13:25:54 26 4
gpt4 key购买 nike

我有一个这样的 vector ;

vector<pair<Point, vector<double> > >

[点(x,y)] , [ 双值1 |双倍值2 | ... |双值N]

我想做的是根据每个值对这个 vector 进行排名,然后计算 vector 中每个元素的平均排名。平均数最高的元素将成为赢家。

通过一种直接的方法,我认为我可以创建这样的对 vector ;

vector<pair<Point(x,y), double value1> >

vector<pair<Point(x,y), double value2> >

...

vector<pair<Point(x,y), double valueN> >

然后对每个 vector 进行排序,存储排名等,同时保持基于 Point(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++ 中的多值排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33348707/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com