c++14 - 这是在字符串上附加字符的好方法吗?
c++14 - Is this a good way to prepend a char on a string?
如果我想在字符串 s 的开头添加 char c,以下做法是好习惯吗?
string s = "oo";
char c = 'f';
s = c + s;
在SO上的问题">Prepend std::string"中,建议这样做的答案不如建议使用成员函数.insert()
的顶部答案那么受欢迎。
除了效率之外,还有什么原因吗(s = c + s
效率不高,因为必须复制string s
的所有内容(?
既然两者都执行相同的操作,除了效率之外还有什么原因?c+s
将创建一个临时字符串,因此需要c
和s
中每个字符的副本,以及潜在的堆分配。然后,临时对象将被移动到给定对象中,该对象将释放其当前内存(如果有(。这些不是廉价的操作。
相比之下,insert
仅在新字符的容量不足时执行堆分配。您仍然会进行复制,因为您是在开头插入的。但仅此而已。它与在连续阵列的头部插入一样高效。
s = c + s
操作将创建一个临时对象,可能在堆上动态分配内存。执行所需的追加操作,然后将其复制回字符串变量。涉及更多数量的指令和内存操作。
分配和取消分配内存等内存操作的成本很高。 仅当没有足够的连续内存可用于字符串时,插入才会重新分配内存。最坏的情况是,它仍然符合s = c + s
方法。
虽然这不是一个太大的性能问题(考虑到最坏的情况(,但从程序员的角度来看,它更优雅,更容易理解。
另请注意,没有什么可以阻止字符串的实现允许在两端进行有限的追加,而无需移动内容。默认实现不这样做,但某些实现可能会在第一次预置时在字符串的前面保留额外的空间,以便后续的预置是"空闲的"。有一些矢量实现可以做到这一点。
相关文章:
- 寻找一种更好的方法来表示无符号字符数组
- 打印字符数组地址的正确方法
- 在 std::vector<无符号字符中存储任意数据的方法>
- 在C++事务之间存储大量字符数据的有效方法
- 比较"A"、"C"、"G"'T'字符的最快方法
- 一种将 Dart 中的字节数据转换为 C++ 中的无符号字符*的有效方法?
- C++-将ASCII字符数组中可能的数值转换为字符的最简单方法
- C++ - 创建具有相同字符的特定大小的以 null 结尾的 c 样式字符串的更好方法
- c++14 - 这是在字符串上附加字符的好方法吗?
- 从ostringstream获取最长行的字符数的智能方法
- 常量字符*的模板方法专用化
- 将字符数组设置为彼此相等的方法不起作用
- 字符 - 'pub' 在 std::streambuf::p ubsetbuf() 方法中是什么意思?
- 比较字符* (C/C++) 的最快方法?
- 将大文件读取到字符数组的正确方法
- 使用 fstream 在空格分隔文件中查看下一项(不仅仅是一个字符)的方法
- 将空填充但不以空结尾的固定长度字符数组转换为 std::string 的最佳方法
- isdigit() 和 isalnum() 给出错误,因为输入是一个常量字符并且无法转换。其他可能查看输入是否为数字的方法?
- 我通过迭代加法将二进制数转换为十进制并检查单个字符(请参阅代码)的方法有什么问题?
- 如何使从基类继承的对象访问字符方法,但有自己的结果