【问题标题】:Does string::capacity/reserve() count terminating null?string::capacity/reserve() 是否计算终止为空?
【发布时间】:2019-08-03 17:13:03
【问题描述】:

从cppref 对capacity()reserve() 的描述中看不出是否计入终止空字符。

【问题讨论】:

    标签: c++ stdstring c++-standard-library


    【解决方案1】:

    标准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() 不包括终止空字符所需的空间。
    【解决方案2】:

    标准对此不置可否。在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
    

    【讨论】:

      猜你喜欢
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      相关资源
      最近更新 更多