9.5.1. Дополнительные способы создания строк
В дополнение к конструкторам, описанным в разделе 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); // копирует cp до нулевого символа;
// s1 == "Hello World!!!"
string s2(noNull,2); // копирует два символа из noNull; s2 == "Hi"
string s3(noNull); // непредсказуемо: noNull не завершается null
string s4(cp + 6, 5); // копирует 5 символов, начиная с cp[6];
// s4 == "World"
string s5(s1, 6, 5); // копирует 5 символов, начиная с s1[6];
// s5 == "World"
string s6(s1, 6); // копирует от s1[6] до конца s1;
// s6 == "World!!!"
string s7(s1, 6, 20); // ok, копирует только до конца s1;
// s7 == "World!!!"
string s8(s1, 16); // передает исключение out_of_range
Обычно строка создается из типа const char*. Массив, на который указывает указатель, должен завершаться нулевым символом; символы копируются до нулевого символа. Если передается также количество, массив не обязан заканчиваться нулевым символом. Если количество не указано и нет нулевого символа или если указанное количество больше размера массива, результат непредсказуем.
При копировании из строки можно предоставить необязательный параметр исходной позиции и количество копируемых символов. Исходная позиция должна быть меньше или равна размеру переданной строки. Если исходная позиция больше размера, то конструктор передаст исключение out_of_range (см. раздел 5.6). При передаче количества копирование начинается с указанной позиции. Независимо от количества запрошенных символов, копирование осуществляется до размера строки, но не более.
Функция substr()
Функция substr() (представленная в табл. 9.12) возвращает копию части или всей исходной строки. Ей можно передать (необязательно) начальную позицию и количество копируемых символов:
string s("hello world");
string s2 = s.substr(0, 5); // s2 = hello
string s3 = s.substr(6); // s3 = world
string s4 = s.substr(6, 11); // s3 = world
string s5 = s.substr(12); // передает исключение out_of_range
Если начальная позиция превышает размер исходной строки, функция substr() передает исключение out_of_range (см. раздел 5.6). Если начальная позиция в сумме с количеством копируемых символов превосходит размер строки, то копирование осуществляется только до конца строки.
Таблица 9.12. Функция substr()
s.substr(pos, n) Возвращает строку, содержащую n символов из строки s, начиная с позиции pos. По умолчанию параметр pos имеет значение 0. Параметр n по умолчанию имеет значение, подразумевающее копирование всех символов строки s, начиная с позиции posУпражнения раздела 9.5.1
Упражнение 9.41. Напишите программу, инициализирующую строку из вектора vector<char>.
Упражнение 9.42. Учитывая, что символы в строку следует читать по одному и заранее известно, что прочитать предстоит по крайней мере 100 символов, как можно было бы улучшить производительность программы?