问题描述
class OutputClass
{
public:
OutputClass(int x,int y);
};
std::vector<OutputClass> Convert(std::vector<int> const &input)
{
std::vector<OutputClass> res;
res.reserve(input.size());
//either (1)
for (auto const &in : input)
res.emplace_back(in,in*in);
return res;
//or something like (2)
std::transform(input.begin(),input.end(),std::back_inserter(res),[](InputClass const &in){return OutputClass(in,in*in);});
return res;
}
这两个选项在性能上有区别吗?静态分析器通常有一个规则,用算法替换所有原始循环,但在这种情况下,在我看来,使用 emplace_back 循环会更有效,因为我们不需要复制或移动。或者我错了,它们在性能方面是相同的,并且 (2) 在良好的风格和可读性方面更可取?
解决方法
要确定在特定用例中一个是否明显比另一个快,您可以进行测量。
我认为强制创建向量没有任何好处。在不需要时避免动态分配对性能来说非常好。这是一个使用向量的示例,但这不是必需的:
OutputClass
convert(int in)
{
return {in,in*in};
}
auto
convert_range(const auto& input)
{
return std::ranges::transform_view(input,convert);
}
#include <vector>
int main()
{
std::vector<int> input {1,2,3};
auto r = convert_range(input);
std::vector<OutputClass> output(r.begin(),r.end());
}