我想通过转换另一个向量来初始化一个向量。我用两种内联初始化的方式进行了测试std::vector
。
一种使用 lambda 内联初始化(带std::transform
):
std::vector<int> foo(100,42);
const auto fooTimesTwo = [&]{
std::vector<int> tmp(foo.size());
std::transform(foo.begin(), foo.end(), tmp.begin(), convert);
return tmp;
}();
而另一个 - 使用std::ranges::views::transform
:
std::vector<int> foo(100,42);
auto transform_range = (foo | std::ranges::views::transform(convert));
std::vector<int> fooTimesTwo {
transform_range.begin(),
transform_range.end()
};
我预计两种向量初始化方式都应该具有相似的性能,但由于某种原因,传统解决方案的基准std::transform
比第二种方法快得多(快 9.7 倍 -> https://quick-bench.com/q/3PSDRO9UbMNunUpdWGNShF49WlQ) .
我的问题是:
- 我使用
std::ranges::views::transform
不正确吗? - 为什么它工作得这么慢?
旁注 - 可以使用 来完成boost::make_transform_iterator
,但我无法在快速台上检查它,因为它们不支持 boost。所以我不确定这种解决方案的效率。