На этом уроке мы рассмотрим операции присваивания других значений для std::string и перестановку значений двух строк.
Присваивание для std::string других значений
Самый простой способ присвоить std::string другое значение — использовать перегруженный оператор присваивания =. Или, в качестве альтернативы, метод assign().
string& string::operator=(const string& str)
string& string::assign(const string& str)
string& string::operator=(const char* str)
string& string::assign(const char* str)
string& string::operator=(char c)
Эти функции позволяют присваивать std::string значения разных типов.
Они возвращают скрытый указатель *this, что позволяет «связывать» объекты.
Обратите внимание, функции assign(), которая бы принимала один символ, нет.
Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#include <iostream> #include <string> int main() { using namespace std; string sString; // Присваиваем std::string другую строку sString = string("One"); cout << sString << endl; const string sTwo("Two"); sString.assign(sTwo); cout << sString << endl; // Присваиваем std::string строку C-style sString = "Three"; cout << sString << endl; sString.assign("Four"); cout << sString << endl; // Присваиваем std::string значение типа char sString = '5'; cout << sString << endl; // Связываем объекты string sOther; sString = sOther = "Six"; cout << sString << " " << sOther << endl; return 0; } |
Результат:
One
Two
Three
Four
5
Six Six
Метод assign() также имеет несколько других разновидностей.
string& string::assign(const string& str, size_type index, size_type len)
Эта функция присваивает std::string подстроку str
длиной len
, начиная с index
-а.
Генерирует исключение out_of_range, если index
недопустим.
Возвращает скрытый указатель *this, что позволяет «связывать» объекты.
Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <iostream> #include <string> int main() { const std::string sSomething("abcdefgh"); std::string sDest; sDest.assign(sSomething, 3, 5); // присваиваем sDest подстроку sSomething длиной 5, начиная с индекса 3 std::cout << sDest << std::endl; return 0; } |
Результат:
defgh
string& string::assign(const char* chars, size_type len)
Эта функция присваивает std::string строку C-style длиной len
.
Генерирует исключение length_error, если результат превышает максимальное количество символов.
Возвращает скрытый указатель *this, что позволяет «связывать» объекты.
Например:
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <iostream> #include <string> int main() { std::string sDest; sDest.assign("abcdefgh", 5); std::cout << sDest << std::endl; return 0; } |
Результат:
abcde
Эта функция потенциально опасна, поэтому использовать её не рекомендуется.
string& string::assign(size_type len, char c)
Эта функция присваивает std::string определенное количество вхождений символа c
. Количество вхождений указывается в len
.
Генерирует исключение length_error, если результат превышает максимальное количество символов.
Возвращает скрытый указатель *this, что позволяет «связывать» объекты.
Например:
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <iostream> #include <string> int main() { std::string sDest; sDest.assign(5, 'h'); std::cout << sDest << std::endl; return 0; } |
Результат:
Перестановка значений двух строк
Если у вас есть две строки, значения которых вы хотите поменять местами, используйте функцию swap().
void string::swap(string &str)
void swap(string &str1, string &str2)
Обе функции меняют местами значения двух строк. Первый вариант функции swap() меняет местами значения *this и str
, а второй — str1
и str2
.
Используйте данные функции вместо операции присваивания, если нужно поменять местами значения двух строк.
Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <iostream> #include <string> using namespace std; int main() { string sStr1("green"); string sStr2("white"); cout << sStr1 << " " << sStr2 << endl; swap(sStr1, sStr2); cout << sStr1 << " " << sStr2 << endl; sStr1.swap(sStr2); cout << sStr1 << " " << sStr2 << endl; return 0; } |
Результат:
green white
white green
green white
На следующем уроке мы рассмотрим добавление значений к std::string.
А есть какие-нибудь отличия между std::string::swap и std::swap? Использует ли std::string::swap семантику перемещения?
По сути std::string::swap является оберткой std::swap, с дополнительными проверками.