【发布时间】:2019-08-03 17:13:03
【问题描述】:
从cppref 对capacity() 和reserve() 的描述中看不出是否计入终止空字符。
【问题讨论】:
标签: c++ stdstring c++-standard-library
从cppref 对capacity() 和reserve() 的描述中看不出是否计入终止空字符。
【问题讨论】:
标签: c++ stdstring c++-standard-library
标准states that:
在所有情况下,
size() <= capacity()。
并且size() 不包括终止空值。
由于size() 可能等于capacity(),在这种情况下,这意味着capacity() 也不会计算终止的空值。
请注意,在 C++11 及更高版本中,mystring.c_str() 等价于mystring.data() 等价于&mystring[0],mystring[mystring.size()] 保证为'\0'。
检查此Demo。
【讨论】:
capacity() 可以等于size() 的事实显然允许capacity() 不包括终止空字符所需的空间。
标准对此不置可否。在documentation of basic_string 中甚至没有提到空字符。
在许多成员函数的文档中,都提到:
capacity() 至少与 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
【讨论】: