C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 有效积累大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我有字符串向量,我想通过std :: accumulate连接它们.

如果我使用以下代码

std::vector<std::string> foo{"foo","bar"};
String res=""; 
res=std::accumulate(foo.begin(),foo.end(),res,[](String &rs,String &arg){ return rs+arg; });

我可以肯定会有临时对象构造.

this回答他们说std :: accumulate的效果是这样指定的:

所以我想知道这样做的正确方法是什么,以避免不必要的临时对象构造.

一个想法是以这种方式改变lambda:

[](String &rs,String &arg){ rs+=arg; return rs; }

在这种情况下,我认为我强制有效串联字符串并帮助编译器(我知道我shouldn’t)省略了不必要的副本,因为这应该等同于(伪代码):

accum = [](& accum,& arg){ ...; return accum; }

因此

accum = & accum;

一个想法是使用

accum = [](& accum,& arg){ ...; return std::move(accum); }

但这可能会导致类似于:

accum = std::move(& accum);

这看起来很可疑.

写这个的正确方法是什么,以尽量减少不必要的临时对象创建的风险?我不只是对std :: String感兴趣,我很乐意有一个解决方案,这可能适用于任何具有复制和移动构造函数/赋值的对象.

解决方法

请尝试以下方法
res=std::accumulate(foo.begin(),const String &arg) -> String & { return rs+=arg; });

在此通话之前可能会有一个电话

std::string::size_type n = std::accumulate( foo.begin(),std::string::size_type( 0 ),[] ( std::string_size_type n,const std::string &s ) { return ( n += s.size() ); } );

res.reserve( n );

大佬总结

以上是大佬教程为你收集整理的c – 有效积累全部内容,希望文章能够帮你解决c – 有效积累所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:c有效积累