string::capacity/reserve() 算作终止 null 吗?

Does string::capacity/reserve() count terminating null?

从cppref关于capacity() and reserve()的描述来看,是否计算终止空字符并不明显。

标准states that:

In all cases, size() <= capacity().

并且size()不包括终止空值。

因为 size() 可能等于 capacity(),在这种情况下,这意味着 capacity() 也不计算终止空值。

注意在C++11及以后的版本中,mystring.c_str()等价于mystring.data()等价于&mystring[0]mystring[mystring.size()]保证为'[=19 =]'.

检查此 Demo

标准对此不置可否。 documentation of basic_string.

中甚至没有提到空字符

在许多成员函数的文档中,提到:

capacity() a value at least as large as size()

但是,没有任何内容表明 capacity() 必须大于 size() 才能容纳空字符。

这是一个示例程序,显示 resize()capacity() 都不知道有关终止空字符的任何信息。

#include <iostream>
#include <string>

int main()
{
   std::string s1(10, 'a');
   std::cout << "size: " << s1.size() << std::endl;
   std::cout << "capacity: " << s1.capacity() << std::endl;

   std::string s2;
   s2.resize(5);
   s2[0] = 'a';
   s2[1] = 'b';
   s2[2] = 'c';
   s2[3] = 'd';
   s2[4] = 'e';
   std::cout << "size: " << s2.size() << std::endl;
   std::cout << "capacity: " << s2.capacity() << std::endl;

   std::string s3("abcd");
   std::cout << "size: " << s3.size() << std::endl;
   std::cout << "capacity: " << s3.capacity() << std::endl;
}

在我的笔记本电脑上用 g++ --std=c++14 输出:

size: 10
capacity: 10
size: 5
capacity: 5
size: 4
capacity: 4