我有某种类型的元素数组T
。对于一些复杂的函数,我想按该函数的值对数组进行排序。有效率的。
当我对如何做这样的事情进行一些研究时,我很快发现 range::v3::sort
,从 range-v3 库中,可以在projections的帮助下使用。在这种情况下,T
可以将该值投影到比较器使用的新值上。问题是,它是懒惰地完成的。
考虑以下示例:
#include <range/v3/algorithm/sort.hpp>
#include <vector>
#include <iostream>
int main() {
int invocations=0;
std::vector<int> data{1,5,2,7,6,3,4,8,9,0};
auto f = [&](int val){
++invocations;
return val%2 ? val+100 : val;
};
ranges::v3::sort(data, std::less<int>{}, f);
for (int v : data) {
std::cout << v << ' ';
}
std::cout << "Invocations " << invocations << std::endl;
}
为简洁起见,此处保持T
简单。f
这给了我输出:
0 2 4 6 8 1 3 5 7 9 Invocations 60
但设想这f
是一些我不想重复执行的复杂功能,每次在比较器中使用它(否则我可以编写一个自定义比较器并使用常规std::sort
)。我希望f
每个值都只被调用一次。但是,一旦对数组进行了排序,f
就可以丢弃 的结果。
此外,它们自身的真实价值T
也相对复杂。我可以快速交换两个元素,但我不应该将它们复制到一个新的临时容器(例如std::vector<std::pair<T,int>>
)中进行排序。
除了手动排序我的输入数组之外,还有一些简单的方法吗?