cpp

Классы string и wstring

C-строки являются массивами, поэтому работать с такими строками не очень удобно. Например, нельзя присвоить строку в двойных кавычках после объявления строки:

char str1[] = "abc"; // Нормально
char str2[7];
str2 = "abc";        // Ошибка

Кроме того, нельзя увеличить размер строки после объявления или соединить две строки в одну с помощью операторов:

char str1[] = "abc", str2[7] = "def";
char str3[] = str1 + str2;             // Ошибка

Класс string предоставляет более удобный интерфейс доступа, который избавляет программиста от необходимости следить за размером символьного массива и предоставляет множество методов для обработки строки. При необходимости можно преобразовать объект класса string в C-строку. Название класса string является лишь псевдонимом шаблонного класса basic_string:

template<typename _CharT, typename _Traits = char_traits<_CharT>,
         typename _Alloc = allocator<_CharT> >
   class basic_string;
typedef basic_string<char> string;

Класс wstring предоставляет удобный интерфейс для работы с L-строками. Название класса wstring является лишь псевдонимом шаблонного класса basic_string:

typedef basic_string<wchar_t> wstring;

Классы string и wstring являются псевдонимами шаблонного класса basic_string. Поэтому с объектами класса wstring можно производить такие же операции, как и с объектами класса string, а также использовать те же самые методы. Различие заключается в типах данных.

Для использования классов string и wstring необходимо подключить файл string:

#include <string>

Объявление и инициализация строки

Создать объект строки можно следующими способами:

  • объявить переменную без инициализации. Для этого перед названием переменной указывается название класса. Размер строки указывать не нужно. Пример:
std::string str;
std::wstring wstr;
std::cout << str.size() << std::endl;  // 0
std::cout << wstr.size() << std::endl; // 0
  • указать литерал строки внутри круглых скобок или после оператора =:
std::setlocale(LC_ALL, "Russian_Russia.1251");
std::string str1("строка1");
std::string str2 = "строка2";
std::cout << str1 << ' ' << str2 << std::endl;
// строка1 строка2
std::wstring wstr1(L"строка1");
std::wstring wstr2 = L"строка2";
std::wcout << wstr1 << ' ' << wstr2 << std::endl;
// строка1 строка2

Если во втором параметре передать число, то можно присвоить только часть строки, а не всю строку:

std::setlocale(LC_ALL, "Russian_Russia.1251");
std::string str("строка", 3);
std::cout << str << std::endl;    // стр
std::wstring wstr(L"строка", 3);
std::wcout << wstr << std::endl;  // стр
  • указать объект строки внутри круглых скобок или после оператора =:
std::setlocale(LC_ALL, "Russian_Russia.1251");
std::string str1("строка");
std::string str2(str1);
std::string str3 = str1;
std::cout << str2 << std::endl;    // строка
std::cout << str3 << std::endl;    // строка
std::wstring wstr1(L"строка");
std::wstring wstr2(wstr1);
std::wstring wstr3 = wstr1;
std::wcout << wstr2 << std::endl;  // строка
std::wcout << wstr3 << std::endl;  // строка

Можно присвоить не все содержимое объекта, а его часть. Для этого во втором параметре следует передать начальный индекс, а в третьем параметре количество символов. Если количество символов не указано, то копируется фрагмент до конца строки. Пример:

std::setlocale(LC_ALL, "Russian_Russia.1251");
std::string str1("строка");
std::string str2(str1, 3);
std::string str3(str1, 1, 3);
std::cout << str2 << std::endl;    // ока
std::cout << str3 << std::endl;    // тро
std::wstring wstr1(L"строка");
std::wstring wstr2(wstr1, 3);
std::wstring wstr3(wstr1, 0, 3);
std::wcout << wstr2 << std::endl;  // ока
std::wcout << wstr3 << std::endl;  // стр
  • задать диапазон с помощью двух итераторов:
std::setlocale(LC_ALL, "Russian_Russia.1251");
std::string str1("строка");
std::string str2(str1.begin(), str1.end());
std::cout << str2 << std::endl;    // строка
std::wstring wstr1(L"строка");
std::wstring wstr2(wstr1.begin(), wstr1.begin() + 3);
std::wcout << wstr2 << std::endl;  // стр
  • указать в первом параметре количество символов, а во втором параметре символ-заполнитель:
std::setlocale(LC_ALL, "Russian_Russia.1251");
std::string str(5, '*');
std::cout << str << std::endl;    // *****
std::wstring wstr(5, L'ф');
std::wcout << wstr << std::endl;  // ффффф
  • перечислить символы через запятую внутри фигурных скобок:
std::setlocale(LC_ALL, "Russian_Russia.1251");
std::string str {'с', 'т', 'р', 'о', 'к', 'а'};
std::cout << str << std::endl;    // строка
std::wstring wstr {L'с', L'т', L'р', L'о', L'к', L'а'};
std::wcout << wstr << std::endl;  // строка

Создать строку в кодировке UTF-8 можно, например, так:

std::string str_utf8(u8"строка");
for (char &ch : str_utf8) {
   std::cout << (int)ch << ' ';
} // -47 -127 -47 -126 -47 -128 -48 -66 -48 -70 -48 -80
std::cout << std::endl;

Присвоить значение переменной уже после объявления можно с помощью оператора =. Следить за размером строки не нужно. Если производится присваивание объекта классов string или wstring, то создается копия исходного объекта, а не присваивается ссылка на него. Пример:

std::string str1, str2, str3, str4;
str1 = "string";      // Присваивание C-строки
str1 = "new string";  // Следить за размером строки не нужно
str2 = str1;          // Присваивание объекта класса string
str3 = 'я';           // Присваивание символа
// Присваивание нескольких символов
str4 = {'с', 'т', 'р', 'о', 'к', 'а'};
std::cout << str1 << std::endl;   // new string
std::cout << str2 << std::endl;   // new string
std::cout << str3 << std::endl;   // я
std::cout << str4 << std::endl;   // строка

Вместо оператора = для присваивания значения можно воспользоваться методом assign(). Название метода указывается после имени переменной через точку. Прототипы метода:

basic_string &assign(const _CharT *str);
basic_string &assign(const _CharT *str, size_type count);
basic_string &assign(const basic_string &str);
basic_string &assign(const basic_string &str, size_type pos,
                     size_type count);
basic_string &assign(size_type count, _CharT ch);
template<class _InputIterator>
   basic_string &assign(_InputIterator first, _InputIterator last);
basic_string &assign(initializer_list<_CharT> list);

Первый прототип позволяет присвоить строку целиком, а второй прототип — только count первых символов из строки str:

std::setlocale(LC_ALL, "Russian_Russia.1251");
std::string str1, str2;
str1.assign("строка");
std::cout << str1 << std::endl;        // строка
str2.assign("строка", 3);
std::cout << str2 << std::endl;        // стр
std::wstring wstr;
wstr.assign(L"строка");
std::wcout << wstr << std::endl;       // строка

Третий прототип позволяет присвоить объект строки целиком, а четвертый прототип — только count символов, начиная с индекса pos:

std::string str1, str2("строка");
str1.assign(str2);
std::cout << str1 << std::endl;        // строка
str1.assign(str2, 0, 3);
std::cout << str1 << std::endl;        // стр

Пятый прототип присваивает count символов ch:

std::string str;
str.assign(5, '*');
std::cout << str << std::endl;        // *****

Шестой прототип позволяет указать начальную first и конечную last позицию с помощью итераторов:

std::string str1, str2("строка");
str1.assign(str2.begin(), str2.end());
std::cout << str1 << std::endl;        // строка
str1.assign(str2.begin(), str2.begin() + 3);
std::cout << str1 << std::endl;        // стр

Седьмой прототип создает строку из символов внутри списка инициализации:

std::string str;
std::initializer_list<char> list = {'с', 'т', 'р', 'о', 'к', 'а'};
str.assign(list);
std::cout << str << std::endl;        // строка

Учебник C++ (Qt Creator и MinGW)
Учебник C++ (Qt Creator и MinGW) в формате PDF

Реквизиты

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp