我曾经使用这种方法来复制数据,并在容器之间进行一些更改:
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);});