Упражнение 9.39. Объясните, что выполняет следующий фрагмент программы:
vector
svec.reserve(1024);
string word;
while (cin >> word)
svec.push_back(word);
svec.resize(svec.size() + svec.size()/2);
Упражнение 9.40. Если программа в предыдущем упражнении читает 256 слов, какова ее вероятная емкость после вызова функции resize()? Что, если она читает 512, 1 000 или 1 048 слов?
9.5. Дополнительные операции со строками
Кроме операций, общих для всех последовательных контейнеров, тип string предоставляет множество дополнительных. По большей части, эти дополнительные операции либо обеспечивают взаимодействие класса string и символьных массивов в стиле С, либо являются дополнительными версиями функций, позволяющими использовать индексы вместо итераторов.
Библиотека string определяет множество функций, которые, к счастью, следуют единому шаблону. С учетом количества обсуждаемых функций этот раздел может показаться слишком громоздким при первом чтении; поэтому сначала его можно просто просмотреть. Впоследствии, имея представление о существующих видах операций, можно при необходимости вернуться и изучить подробности использования конкретной функции.
В дополнение к конструкторам, описанным в разделе 3.2.1, и конструкторам, общим для всех последовательных контейнеров (см. табл. 9.3), тип string предоставляет еще три конструктора, описанные в табл. 9.11.
Таблица 9.11. Дополнительные способы создания строк
Все значения n, len2 и pos2 являются беззнаковыми. | |
|---|---|
string s(cp, n); | Строка s — копия первых n символов из массива, на который указывает cp. У того массива должно быть по крайней мере n символов |
string s(s2, pos2); | Строка s — копия символов из строки s2, начиная с позиции по индексу pos2. Если pos2 > s2.size(), результат непредсказуем |
string s(s2, pos2, len2); | Строка s — копия len2 символов из строки s2, начиная с позиции по индексу pos2. Если pos2 > s2.size(), то результат непредсказуем. Независимо от значения len2, копируется по крайней мере s2.size() - pos2 символов |
Конструкторы, получающие тип string или const char*, получают дополнительные (необязательные) аргументы, позволяющие задать количество копируемых символов. При передаче строки можно также указать индекс начала копирования:
const char *cp = "Hello World!!!"; //
char noNull[] = {'H', 'i' }; //
string s1(cp); //
//
string s2(noNull,2); //
string s3(noNull); // непредсказуемо: noNull не завершается null
string s4(cp + 6, 5); //
//
string s5(s1, 6, 5); //
//
string s6(s1, 6); //
//
string s7(s1, 6, 20); //
//
string s8(s1, 16); //
Обычно строка создается из типа const char*. Массив, на который указывает указатель, должен завершаться нулевым символом; символы копируются до нулевого символа. Если передается также количество, массив не обязан заканчиваться нулевым символом. Если количество не указано и нет нулевого символа или если указанное количество больше размера массива, результат непредсказуем.