我想在C ++中填充string
,
最初,只需将\0
直接添加到字符串的末尾。
paddingstr = "test";
for (int index = 0; index < 20000*1024; ++index){
paddingstr += '\0';
}
然后我找到了几种实现目标的方法,它们是
我想知道哪种方法效率最高。然后我比较它们。
string paddingstr = "test";
__int64 before_run_t = GetTimeMs64();
string afterpadding = paddingstr.append(string(20000*1024, '\0'));
cout << "The run time of append is " << GetTimeMs64() - before_run_t << endl;
paddingstr = "test";
before_run_t = GetTimeMs64();
paddingstr.insert(paddingstr.end(), 20000*1024, '\0');
cout << "The run time of insert is " << GetTimeMs64() - before_run_t << endl;
paddingstr = "test";
before_run_t = GetTimeMs64();
for (int index = 0; index < 20000*1024; ++index){
paddingstr += '\0';
}
cout << "The run time of adding is " << GetTimeMs64() - before_run_t << endl;
ostringstream ss;
before_run_t = GetTimeMs64();
ss << 't' << std::setw(20000*1024) << std::setfill('a') << '\0';
paddingstr = ss.str();
cout << "The run time of ostream is " << GetTimeMs64() - before_run_t << endl;
结果是
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();
由于\0
在字符串后面填充,而函数str()
只是将t
返回到paddingstr
,因此测试结果不正确。
答案 0 :(得分:2)
插入是最快的,因为你告诉它一次添加20 MB的零,它可以分配一次。追加有点慢,因为它必须分配20 MB的零然后复制它们。循环很慢,因为它必须不断地重新分配越来越多,如果你先调用paddingstr.reserve(20000*1024 + paddingstr.size())
,你至少可以部分修复。并且ostringstream很慢,因为stringstreams通常很慢,而且你最后会复制到字符串。