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
, если результат превышает максимальное количество символов.