22.6 – Добавление данных к объектам std::string
Добавить строку в конец существующей строки легко, для этого необходимо воспользоваться функцией operator+=, append() или push_back().
string& string::operator+= (const string& str)
string& string::append (const string& str)
string& string::append (const string& str)
Эти функции добавляют к строке символы str.
- Обе функции возвращают
*this, поэтому их можно объединить в «цепочку». - Обе функции вызывают исключение
length_error, если результат превышает максимальное количество символов.
Пример кода:
string sString("one");
sString += string(" two");
string sThree(" three");
sString.append(sThree);
cout << sString << endl;
Вывод:
one two three
Также есть вариант append(), который может добавлять подстроку:
string& string::append (const string& str, size_type index, size_type num)
Эта функция добавляет к строке num символов из строки str, начиная с index.
- Возвращает
*this, поэтому ее можно вставить в «цепочку». - Выбрасывает исключение
out_of_range, если индекс выходит за пределы строки. - Выбрасывает исключение
length_error, если результат превышает максимальное количество символов.
Пример кода:
string sString("one ");
const string sTemp("twothreefour");
// добавляем подстроку строки sTemp, начиная с индекса 3, длиной 5
sString.append(sTemp, 3, 5);
cout << sString << endl;
Вывод:
one three
operator+= и append() также имеют версии, которые работают со строками в стиле C.
string& string::operator+= (const char* str)
string& string::append (const char* str)
string& string::append (const char* str)
Эти функции добавляют к строке символы str.
- Обе функции возвращают
*this, поэтому их можно объединить в «цепочку». - Обе функции вызывают исключение
length_error, если результат превышает максимальное количество символов. strне должна быть равнаnullptr.
Пример кода:
string sString("one");
sString += " two";
sString.append(" three");
cout << sString << endl;
Вывод:
one two three
Есть еще один дополнительный вариант append(), который работает со строками в стиле C:
string& string::append (const char* str, size_type len)
Добавляет в строку первые len символов строки str.
- Возвращает
*this, поэтому ее можно вставить в «цепочку». - Выбрасывает исключение
length_error, если результат превышает максимальное количество символов. - Игнорирует специальные символы (включая ").
Пример кода:
string sString("one ");
sString.append("threefour", 5);
cout << sString << endl;
Вывод:
one three
Эта функция опасна, и ее использование не рекомендуется.
Также есть набор функций, которые добавляют символы. Обратите внимание, что имя неоператорной функции для добавления символа – push_back(), а не append()!
string& string::operator+= (char c)
void string::push_back (char c)
void string::push_back (char c)
Эти функции добавляют к строке символ c.
operator+=возвращает*this, чтобы его можно было вставить в «цепочку».- Обе функции вызывают исключение
length_error, если результат превышает максимальное количество символов.
Пример кода:
string sString("one");
sString += ' ';
sString.push_back('2');
cout << sString << endl;
Вывод:
one 2
Вам может быть интересно, почему имя этой функции – push_back(), а не append(). Это следует соглашению об именах, используемому для стеков, где push_back() – это функция, которая добавляет один элемент в конец стека. Если вы представляете строку, как стек символов, то для добавления одного символа в ее конец имеет смысл использовать push_back(). Однако, на мой взгляд, отсутствие функции append() выбивается из последовательности!
Оказывается, есть функция append() для символов, которая выглядит так:
string& string::append (size_type num, char c)
Добавляет количество вхождений символа c в строку
- Возвращает
*this, чтобы ее можно было вставить в «цепочку». - Выдает исключение
length_error, если результат превышает максимальное количество символов.
Пример кода:
string sString("aaa");
sString.append(4, 'b');
cout << sString << endl;
Вывод:
aaabbbb
Есть еще один, последний, вариант append(), который вы не поймете, если не знаете, что такое итераторы. Если вы не знакомы с итераторами, можете игнорировать эту функцию.
string& string::append (InputIterator start, InputIterator end)
Добавляет все символы из диапазона [start, end) (включая начало, но не включая конец)
- Возвращает
*this, чтобы ее можно было вставить в «цепочку». - Выдает исключение
length_error, если результат превышает максимальное количество символов.
