这真的是我自己感兴趣的问题,我无法从文档中确定。我在http://www.cplusplus.com/reference/string/string/上看到append的复杂度为:
"未指定,但通常是新字符串长度的线性级别。"
而push_back()的复杂度为:
"未指定;通常是摊销常数,但最多可以线性增长新字符串长度。"
作为一个玩具例子,假设我想将字符“foo”附加到一个字符串中。会使用哪个方法?
这两种方式完全相同吗?还是有区别的?你可能会认为append更有效率,因为编译器会知道需要多少内存来扩展字符串指定数量的字符,而push_back可能需要每次调用都保证内存。
"未指定,但通常是新字符串长度的线性级别。"
而push_back()的复杂度为:
"未指定;通常是摊销常数,但最多可以线性增长新字符串长度。"
作为一个玩具例子,假设我想将字符“foo”附加到一个字符串中。会使用哪个方法?
myString.push_back('f');
myString.push_back('o');
myString.push_back('o');
和
myString.append("foo");
这两种方式完全相同吗?还是有区别的?你可能会认为append更有效率,因为编译器会知道需要多少内存来扩展字符串指定数量的字符,而push_back可能需要每次调用都保证内存。
myString += "foo";
,因为我认为它更加“自然”,尽管它与append
调用相同。 - Some programmer dudeappend
的典型情况,只是最坏情况。 - Benjamin Lindleypush_back
必须是摊销常数时间,因此我所知道的每个实现都有三个分配的可能性为零。大多数从一些合理的大小(大于1或2)开始,并以几何方式增加底层缓冲区(每次大小增加1.5或2倍)。 - Billy ONeal