【发布时间】:2021-07-08 21:21:53
【问题描述】:
我想通过转换另一个向量来初始化一个向量。我用两种内联初始化方式进行了测试,转换后的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 完成,但我无法在 quick-bench 上检查它,因为它们不支持 boost。所以我不确定这种解决方案的效率。
【问题讨论】:
-
范围可能效率低下。但这很容易。
convert在做什么? -
将一个整数乘以二。
标签: c++ c++20 std-ranges