gpt4 book ai didi

c++ - 为什么 'insert' 在字符串填充中比 'append' 快?

转载 作者:行者123 更新时间:2023-11-30 04:00:20 30 4
gpt4 key购买 nike

我想在 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()只是返回tpaddingstr,所以测试结果不正确。

最佳答案

Insert 是最快的,因为您告诉它一次添加 20 MB 的零,并且它可以分配一次。 Append 有点慢,因为它必须分配 20 MB 的零然后复制它们。循环很慢,因为它必须不断地重新分配越来越多的内容,如果您先调用 paddingstr.reserve(20000*1024 + paddingstr.size()) 至少可以部分解决这个问题。而 ostringstream 很慢,因为 stringstreams 通常很慢,再加上你在最后复制到字符串。

关于c++ - 为什么 'insert' 在字符串填充中比 'append' 快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26395740/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com