为什么是';插入';比'快;追加';在字符串填充中? 我想在C++中添加字符串< /代码>,

为什么是';插入';比'快;追加';在字符串填充中? 我想在C++中添加字符串< /代码>,,c++,string,padding,C++,String,Padding,最初,只需将\0直接添加到字符串的末尾 paddingstr = "test"; for (int index = 0; index < 20000*1024; ++index){ paddingstr += '\0'; } 我的问题是为什么insert是最快的 更新:测试代码从 ss << 't' << std::setw(20000*1024) << std::setfill('\0'); paddingstr = ss.str();

最初,只需将
\0
直接添加到字符串的末尾

paddingstr = "test";
for (int index = 0; index < 20000*1024; ++index){
    paddingstr += '\0';
}
我的问题是为什么insert是最快的

更新:测试代码从

ss << 't' << std::setw(20000*1024) << std::setfill('\0'); 
paddingstr = ss.str();

ssInsert是最快的,因为您告诉它一次添加20 MB的零,并且它可以分配一次。Append的速度稍慢,因为它必须分配20 MB的零,然后复制它们。循环很慢,因为它必须不断地重新分配越来越多的内容,如果您首先调用
paddingstr.reserve(20000*1024+paddingstr.size())
,至少可以部分修复这些内容。ostringstream很慢,因为stringstreams通常很慢,加上您要在末尾复制到字符串。

为什么要将
append
调用的结果分配给新字符串?如果
\0
在原始字符串之后填充,那么
ss.str()
只返回字符串
t
,而不是填充字符串。
The run time of append is 60
The run time of insert is 3
The run time of adding is 8589
The run time of ostream is 2276
ss << 't' << std::setw(20000*1024) << std::setfill('\0'); 
paddingstr = ss.str();