c++ - 用 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());
}
推荐阅读
- r - 将旧数据框中的行放入新数据框中
- javascript - 是否可以使用 javascript 获得多个伪元素?
- html - CSS / HTML 渐变填充模式在 Firefox 中出现故障
- javascript - 用于调整文本大小的 jQuery 效果
- python - Python将图像拆分为帧,颜色混乱
- php - Laravel 6 - 如何修复路由到/返回空白页
- laravel - Laravel Passport:询问用户信息时出现未经身份验证的消息
- unit-testing - 在 NativeScript 中获取用于单元测试的函数参数
- ios - 如何使用 Alamofire 和 Swift Decode 从 JSON 解码和访问 Double
- python - 全局 gunicorn 和 pipenv 虚拟环境:ModuleNotFoundError: No module named 'django'