首页 > 解决方案 > 用 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)在良好的风格和可读性方面更可取?

标签: c++algorithmperformancec++11std

解决方案


要确定在特定用例中一个是否明显快于另一个,您可以进行测量。

我认为强制创建向量没有任何好处。在不需要时避免动态分配对性能非常有利。这是使用向量的示例,但这不是必需的:

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());
}

推荐阅读