【发布时间】:2019-09-04 04:56:18
【问题描述】:
让arr 成为某种类型的数组T 和func(const &T) 一些计算量很大的函数。要按照func(T) 的值对arr 进行排序,我们可以天真地写。
std::sort(arr.begin(), arr.end(), [](const T& a, const T&b) {
return func(a) < func(b);
}
但是,这将平均调用func O(nlogn) 次。显然,我们只需要 n 次调用。有没有任何惯用和简洁的方法来做到这一点?
我知道以下两种解决方案,但我想找到一个更好的解决方案。
将
Ts 和func的返回值打包到一个结构中并对其进行排序。这在计算上是最优的,但它还在排序之前对初始数组进行了一个完整副本,然后再进行另一个完整副本以将值放回arr创建第二个数组并对数组进行并行排序。据我所知,没有惯用的方法来以这种方式对两个数组进行排序。这可以通过编写自定义迭代器和交换函数来完成。这已经足够了,但它也需要比理想更多的样板代码。
理想的解决方案是基于 STL 并尽可能少的样板代码,但欢迎所有贡献。
【问题讨论】:
标签: c++ performance sorting boost transform