我有Foo的载体
vector<Foo> inputs
Foo是一个内部得分较高的结构
struct Foo {
...
float score
bool winner
}
现在,我想按分数对输入进行排序,仅将获胜者分配给前3名。但是,我不想更改原始输入 vector 。所以我想我需要创建一个引用 vector 然后进行排序?创建引用载体是否合法?有没有一种优雅的方法?
最佳答案
如果您确实不想修改原始 vector ,则必须将指针或索引的 vector 排序到原始 vector 中。要回答您的问题的一部分,没有办法制作引用 vector ,并且您不应该这样做。
要查找前三个(或n
)元素,您甚至不必对整个 vector 进行排序。 STL使您了解 std::nth_element
(如果您关心顶部元素的顺序,则可以使用 std::partial_sort
),您可以执行以下操作:
void modify_top_n(std::vector<Foo> &v, int n) {
std::vector<Foo*> tmp(v.size());
std::transform(v.begin(), v.end(), tmp.begin(), [](Foo &f) { return &f; });
std::nth_element(tmp.begin(), tmp.begin() + n, tmp.end(),
[](const Foo* f1, const Foo *f2) { return f1->score > f2->score; });
std::for_each(tmp.begin(), tmp.begin() + n, [](Foo *f) {
f->winner = true;
});
}
假设 vector 至少具有
n
条目。我之所以使用for_each
只是因为它在拥有迭代器范围时更容易使用,也可以使用for循环(如果您使用C++ 17,也可以使用Christophe提到的 for_each_n
)。