c++14 - 这是在字符串上附加字符的好方法吗?

c++14 - Is this a good way to prepend a char on a string?

本文关键字:字符 方法 字符串 c++14      更新时间:2023-10-16

如果我想在字符串 s 的开头添加 char c,以下做法是好习惯吗?

string s = "oo";
char c = 'f';
s = c + s;

在SO上的问题">Prepend std::string"中,建议这样做的答案不如建议使用成员函数.insert()的顶部答案那么受欢迎。

除了效率之外,还有什么原因吗(s = c + s效率不高,因为必须复制string s的所有内容(?

既然两者都执行相同的操作,除了效率之外还有什么原因?c+s将创建一个临时字符串,因此需要cs中每个字符的副本,以及潜在的堆分配。然后,临时对象将被移动到给定对象中,该对象将释放其当前内存(如果有(。这些不是廉价的操作。

相比之下,insert仅在新字符的容量不足时执行堆分配。您仍然会进行复制,因为您是在开头插入的。但仅此而已。它与在连续阵列的头部插入一样高效。

s = c + s操作将创建一个临时对象,可能在堆上动态分配内存。执行所需的追加操作,然后将其复制回字符串变量。涉及更多数量的指令和内存操作。

分配和取消分配内存等内存操作的成本很高。 仅当没有足够的连续内存可用于字符串时,插入才会重新分配内存。最坏的情况是,它仍然符合s = c + s方法。

虽然这不是一个太大的性能问题(考虑到最坏的情况(,但从程序员的角度来看,它更优雅,更容易理解。

另请注意,没有什么可以阻止字符串的实现允许在两端进行有限的追加,而无需移动内容。默认实现不这样做,但某些实现可能会在第一次预置时在字符串的前面保留额外的空间,以便后续的预置是"空闲的"。有一些矢量实现可以做到这一点。