std::basic_string
具有以下构造函数,该构造函数使用指向的以 null 结尾的字符串的内容初始化字符串s
:
std::basic_string(const CharT* s, const Allocator& alloc = Allocator());
但是构造函数如何事先知道要在其内部缓冲区中为字符串保留多少空间?
我可以想到两种方法:
1)它可以先遍历整个以空结尾的字符串,直到找到第一个空字符,记住它遍历了多少个字符,并将其用作其内部缓冲区的容量并开始复制。
缺点:它必须读取字符串两次,一次用于计算字符,第二次用于复制字符串。
2)它可以在其内部缓冲区中保留一个保守的数量,然后开始复制。如果它在缓冲区用完之前命中 NULL 字符,我们就可以了,否则我们需要保留更多空间(同样是保守的数量),并重复这些步骤。
缺点:如果字符串相当大,不断调整容量的开销可能会变得很明显。
那么,一个理智的 std::basic_string 实现是做什么的(或者这甚至在标准中指定)?