微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 emplace_back 与 std::transform 填充向量

如何解决使用 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 举报,一经查实,本站将立刻删除。