【发布时间】:2013-02-11 11:51:15
【问题描述】:
这确实是一个仅出于我个人利益的问题,我无法通过文档确定。
我在 http://www.cplusplus.com/reference/string/string/ 上看到 append 很复杂:
“未指定,但通常在新字符串长度中达到线性。”
而 push_back() 具有复杂性:
“未指定;一般为摊销常数,但在新字符串长度上可达线性。”
作为一个玩具示例,假设我想将字符“foo”附加到字符串中。会
myString.push_back('f');
myString.push_back('o');
myString.push_back('o');
和
myString.append("foo");
完全一样吗?或者有什么不同吗?您可能认为 append 会更有效,因为编译器会知道将字符串扩展至指定字符数需要多少内存,而 push_back 可能需要在每次调用时保护内存?
【问题讨论】:
-
除了显而易见的(前者是三个函数调用,而后者只有一个),前者可能会导致三个重新分配。我个人更愿意使用
myString += "foo";,因为我认为它更“自然”,即使它与append调用相同。 -
关键词:“最多”。虽然很遗憾他们没有说明
append的典型案例,但只说明了最坏的情况。 -
@JoachimPileborg:
push_back必须摊销恒定时间,因此我知道的每个实现的三个分配的可能性为零。大多数从一些合理的大小开始(大于 1 或 2)并以几何方式增长底层缓冲区(每次大小增加 1.5 或 2 倍)。
标签: c++ string append push-back