Считает ли строка :: емкость / резерв () завершающим нулем? - PullRequest
4 голосов
/ 13 марта 2019

Из описания cppref по capacity() и reserve() не очевидно, считается ли завершающий нулевой символ.

Ответы [ 2 ]

6 голосов
/ 13 марта 2019

Стандарт гласит, что :

Во всех случаях size() <= capacity().

И size() не включает завершающий ноль.

Поскольку возможно, что size() равно capacity(), в этом случае это будет означать, что capacity() также не считает завершающий ноль.

Обратите внимание, что в C ++ 11 и более поздних версиях mystring.c_str() эквивалентен mystring.data() эквивалентен &mystring[0], а mystring[mystring.size()] гарантированно равен '\0'.

Проверьте это Демо .

1 голос
/ 13 марта 2019

Стандарт не обязателен в этом отношении. Нулевой символ даже не упоминается в документации basic_string.

Во многих документах функций-членов упоминается, что:

емкость () значение не менее размера ()

Однако ничто не говорит о том, что 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
...