c++ - std::basic_string 构造函数如何预先知道要保留多少空间?

标签 c++ c++11 stdstring

std::basic_string 具有以下构造函数,它使用 s 指向的空终止字符串的内容初始化字符串:

std::basic_string(const CharT* s, const Allocator& alloc = Allocator());

但是构造函数如何预先知道在其内部缓冲区中为字符串保留多少空间?

我想到了两种方法:

1) 它可以先遍历整个以 null 结尾的字符串,直到找到第一个 NULL 字符,记住它遍历了多少个字符,并将其用作其内部缓冲区的容量并开始复制。

缺点:必须读取字符串两次,一次用于计算字符数,第二次用于复制字符串。

2) 它可以在其内部缓冲区中保留一个保守的数量,然后开始复制。如果它在缓冲区用完之前命中 NULL 字符,我们就可以了,否则我们需要保留更多空间(同样是保守数量),然后重复这些步骤。

缺点:如果字符串相当大,不断重新调整容量的开销可能会变得很明显。

那么,一个健全的 std::basic_string 实现是做什么的(或者这甚至在标准中有规定)?

最佳答案

常见的实现会遍历原始字符串来计算长度,然后分配那么多的空间。它需要遍历字符串两次,但这是一个快速操作,在某些情况下有硬件支持,甚至在操作没有硬件支持时,与单次内存分配相比,它可能便宜

关于c++ - std::basic_string 构造函数如何预先知道要保留多少空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19778226/

相关文章:

c++ - 在标准容器中实现尺寸

c++ - 输出所有可变模板参数

c++ - 初始化 std::string 的 std::vector

c++ - 从 "const std::string"初始化 "std::istringstream"

c++ - 保留临时 std::string 并返回 c_str() 以防止内存泄漏

c++ - 常数乘法的奇怪值

c++ - C++中从树中删除节点的算法

c++ - 模板类多文件项目 - 如何?

c++ - 如何访问 std::vector 迭代器中的 std::map 属性?

c++ - CRTP 基本构造函数崩溃,因为未构造子项