我曾经使用这种方法来复制数据,并在容器之间进行一些更改:

std::vector<Tsrc> source{Tsrc(),Tsrc(2),Tsrc(3),Tsrc(4)};
std::vector<Tdst> dst(source.size());
std::transform(begin(source),end(source),begin(dst),[](Tsrc& item){
    return do_something(item);
}

首先,以前的代码是否标准且干净?可以应用任何增强功能吗?

其次,我现在想做同样的事情,但是对于没有默认构造函数的Tdst。因此,以上代码将不起作用。我将其替换为:
std::vector<Tsrc> source{Tsrc(),Tsrc(2),Tsrc(3),Tsrc(4)};
std::vector<Tdst> dst;
dst.reserve(source.size());
for(auto& item:dst){
    dst.emplace_back(do_something(item));
}

这是正确的方法吗?有什么建议吗?

最佳答案

你在做什么看起来不错。您可以使用 std::back_inserter 避免显式循环。另外,由于原始范围的元素未修改,因此应将lambda的参数设为const:

dst.reserve(source.size());
std::transform(begin(source), end(source), back_inserter(dst),
               [](const Tsrc& item){return do_something(item);});

09-07 09:08