这确实是一个问题,只是出于我个人的利益,我无法通过文档确定。
我在http://www.cplusplus.com/reference/string/string/上看到追加具有复杂性:
“未指定,但通常在新的字符串长度中最大为线性。”
而push_back()具有复杂性:
“未指定;通常为摊销常数,但在新字符串长度中最大为线性。”
作为一个玩具示例,假设我想将字符“foo”附加到字符串中。将
myString.push_back('f');
myString.push_back('o');
myString.push_back('o');
和
myString.append("foo");
等于完全一样的东西?还是有什么区别?您可能会认为append会更有效,因为编译器会知道需要多少内存才能将字符串扩展为指定数量的字符,而push_back可能需要确保每个调用的内存安全?
最佳答案
在C++ 03(为“cplusplus.com”编写了大部分文档)中,未指定复杂性,因为允许库实现者对字符串进行写时复制或“绳索样式”内部表示。例如,如果修改了字符并且正在进行共享,则COW实现可能需要复制整个字符串。
在C++ 11中,禁止使用COW和绳索实现。您应该期望每个添加的字符有固定的摊销时间,或者为添加到末尾的字符串增加的线性字符数有线性的摊销时间。实现者可能仍然会对字符串做相对疯狂的事情(与std::vector
相比),但是大多数实现将仅限于诸如“小字符串优化”之类的事情。
在比较push_back
和append
时,push_back
剥夺了底层实现的潜在有用的长度信息,该长度信息可能用于预分配空间。另一方面,append
要求实现两次遍历输入才能找到该长度,因此性能的得失将取决于许多未知因素,例如尝试追加之前字符串的长度。就是说,差异可能非常小。为此,请使用append
-更具可读性。
关于c++ - C++ std::string append vs push_back(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15082170/