如何解决使用 emplace_back 与 std::transform 填充向量
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());
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。