Шаг 369.
Библиотека STL.
Строки. Размер и емкость

    На этом шаге мы рассмотрим методы, используемые для работы с этими параметрами строк.

    Чтобы правильно и эффективно использовать строки, необходимо хорошо понимать, как связаны их размер и емкость. Для строк существуют целых три "размера".

    Достаточная емкость строки важна по двум причинам:

    Следовательно, если в программе используются указатели, ссылки и итераторы, относящиеся к символам строки, или если программа критична по скорости, следует учитывать ее емкость.

    Функция reserve() помогает предотвратить перераспределение памяти. Она заранее резервирует нужную емкость и обеспечивает действительность ссылок (при условии, что размер строки не превышает зарезервированную емкость):

std::string s;   // Создание пустой строки 
s.reserve(80);   // Резервирование памяти для 80 символов

    В принципе концепция емкости для строк похожа на концепцию емкости векторов (смотри 130 шаг), но с одним важным отличием: строки позволяют вызывать функцию reserve() для сокращения емкости. Вызов reserve() с аргументом, меньшим текущей емкости, фактически является запросом на сокращение емкости, не обязательным для выполнения. Если аргумент меньше текущего количества символов, то емкость сокращается до текущего размера строки. Следовательно, даже если вы хотите сократить емкость, вызов функции еще не гарантирует желаемого результата. По умолчанию аргумент функции reserve() для строк равен нулю. Следовательно, вызов reserve() без аргументов всегда означает запрос на сокращение емкости до текущего размера строки, но этот запрос не обязателен для выполнения:

s.reserve(); // Запрос на сокращение емкости до текущего размера

    Запрос на сокращение емкости не обязателен для выполнения, поскольку способ достижения оптимального быстродействия определяется реализацией. В реализациях строковых классов могут использоваться разные критерии оптимизации по скорости и затратам памяти. Следовательно, некоторые реализации могут увеличивать емкость с большими приращениями и вообще не поддерживать ее сокращения.

    Тем не менее в стандарте указано, что емкость строки может уменьшаться только вследствие вызова функции reserve(). Это гарантирует, что ссылки, указатели и итераторы останутся действительными даже при удалении и изменении символов (если они относятся к позициям, предшествующим позиции модификации).

    На следующем шаге мы рассмотрим способы обращения к символам строки.




Предыдущий шаг Содержание Следующий шаг