std::basic_string
| Определено в заголовочном файле <string>
|
||
| template< class CharT, |
(1) | |
| namespace pmr { template <class CharT, class Traits = std::char_traits<CharT>> |
(2) | (начиная с C++17) |
Шаблон класса basic_string хранит и управляет последовательностями char-подобных объектов, которые не являются объектами массива тривиального типа стандартной компоновки. Класс не зависит ни от типа символа, ни от характера операций с этим типом. Определения операций предоставляются через параметр шаблона Traits - специализацию std::char_traits или совместимого класса свойств. Traits::char_type и CharT должны именовать один и тот же тип; иначе программа будет некорректной.
Элементы basic_string хранятся непрерывно, то есть для basic_string s, &*(s.begin() + n) == &*s.begin() + n для любого n в [0, s.size()), и *(s.begin() + s.size()) имеет значение CharT() (нулевой терминатор) (начиная с C++11); или, что то же самое, указатель на s[0] может быть передан функциям, которые ожидают указатель на первый элемент массива (до C++11)массива, заканчивающегося нулём (начиная с C++11) элементов CharT.
std::basic_string соответствует требованиям AllocatorAwareContainer, SequenceContainer и ContiguousContainer (начиная с C++17)
|
Функции-элементы Однако объекты |
(начиная с C++20) |
Предусмотрено несколько определений типов для общих типов символов:
| Определены в заголовочном файле
<string> | |
| Тип | Определение |
| std::string | std::basic_string<char> |
| std::wstring | std::basic_string<wchar_t> |
| std::u8string (C++20) | std::basic_string<char8_t> |
| std::u16string (C++11) | std::basic_string<char16_t> |
| std::u32string (C++11) | std::basic_string<char32_t> |
| std::pmr::string (C++17) | std::pmr::basic_string<char> |
| std::pmr::wstring (C++17) | std::pmr::basic_string<wchar_t> |
| std::pmr::u8string (C++20) | std::pmr::basic_string<char8_t> |
| std::pmr::u16string (C++17) | std::pmr::basic_string<char16_t> |
| std::pmr::u32string (C++17) | std::pmr::basic_string<char32_t> |
Содержание |
[править] Параметры шаблона
| CharT | — | тип символа |
| Traits | — | класс свойств, определяющий операции с типом символа |
| Allocator | — | тип Allocator, используемый для выделения внутренней памяти |
[править] Типы элементы
| Тип элемента | Определение | ||||
traits_type
|
Traits
| ||||
value_type
|
CharT
| ||||
allocator_type
|
Allocator
| ||||
size_type
|
| ||||
difference_type
|
| ||||
reference
|
value_type&
| ||||
const_reference
|
const value_type& | ||||
pointer
|
| ||||
const_pointer
|
| ||||
iterator
|
| ||||
const_iterator
|
| ||||
reverse_iterator
|
std::reverse_iterator<iterator> | ||||
const_reverse_iterator
|
std::reverse_iterator<const_iterator> | ||||
[править] Функции элементы
создаёт basic_string (public функция-элемент) | |
| уничтожает строку, освобождая внутреннюю память, если она используется (public функция-элемент) | |
| присваивает значения строке (public функция-элемент) | |
| присваивает символы строке (public функция-элемент) | |
| (C++23) |
присваивает диапазон символов строке (public функция-элемент) |
| возвращает связанный аллокатор (public функция-элемент) | |
Доступ к элементам | |
| обращается к указанному символу с проверкой границ (public функция-элемент) | |
| получает доступ к указанному символу (public функция-элемент) | |
| (DR*) |
получает доступ к первому символу (public функция-элемент) |
| (DR*) |
получает доступ к последнему символу (public функция-элемент) |
| возвращает указатель на первый символ строки (public функция-элемент) | |
| возвращает немодифицируемую стандартную версию массива символов C строки (public функция-элемент) | |
| (C++17) |
возвращает неизменяемый string_view всей строки (public функция-элемент) |
Итераторы | |
| (DR*) |
возвращает итератор на начало (public функция-элемент) |
| (DR*) |
возвращает итератор на конец (public функция-элемент) |
| (DR*) |
возвращает обратный итератор на начало (public функция-элемент) |
| (DR*) |
возвращает обратный итератор на конец (public функция-элемент) |
Вместимость | |
| проверяет, пуста ли строка (public функция-элемент) | |
| возвращает количество символов (public функция-элемент) | |
| возвращает максимальное количество символов (public функция-элемент) | |
| резервирует память (public функция-элемент) | |
| возвращает количество символов, которые могут храниться в выделенной в данный момент памяти (public функция-элемент) | |
| (DR*) |
уменьшает использование памяти за счёт освобождения неиспользуемой памяти (public функция-элемент) |
Операции | |
| очищает содержимое (public функция-элемент) | |
| вставляет символы (public функция-элемент) | |
| (C++23) |
вставляет диапазон символов (public функция-элемент) |
| удаляет символы (public функция-элемент) | |
| добавляет символ в конец (public функция-элемент) | |
| (DR*) |
удаляет последний символ (public функция-элемент) |
| добавляет символы в конец (public функция-элемент) | |
| (C++23) |
добавляет диапазон символов в конец (public функция-элемент) |
| добавляет символы в конец (public функция-элемент) | |
| сравнивает две строки (public функция-элемент) | |
| (C++20) |
проверяет, начинается ли строка с заданного префикса (public функция-элемент) |
| (C++20) |
проверяет, заканчивается ли строка заданным суффиксом (public функция-элемент) |
| (C++23) |
проверяет, содержит ли строка данную подстроку или символ (public функция-элемент) |
| заменяет указанную часть строки (public функция-элемент) | |
| (C++23) |
заменяет указанную часть строки диапазоном символов (public функция-элемент) |
| возвращает подстроку (public функция-элемент) | |
| копирует символы (public функция-элемент) | |
| изменяет количество сохранённых символов (public функция-элемент) | |
| (C++23) |
изменяет количество сохранённых символов и, возможно, перезаписывает неопределённое содержимое с помощью операции, предоставляемой пользователем (public функция-элемент) |
| меняет местами содержимое (public функция-элемент) | |
Поиск | |
| находит первое вхождение заданной подстроки (public функция-элемент) | |
| ищет последнее вхождение подстроки (public функция-элемент) | |
| ищет первое вхождение символов (public функция-элемент) | |
| ищет первое отсутствие символов (public функция-элемент) | |
| ищет последнее вхождение символов (public функция-элемент) | |
| ищет последнее отсутствие символов (public функция-элемент) | |
Константы | |
| [static] |
специальное значение. Точное значение зависит от контекста (public static константа-элемент) |
[править] Функции, не являющиеся элементами
| объединяет две строки или строку и символ (шаблон функции) | |
| (удалено в C++20)(удалено в C++20)(удалено в C++20)(удалено в C++20)(удалено в C++20)(C++20) |
лексикографически сравнивает две строки (шаблон функции) |
| специализация алгоритма std::swap (шаблон функции) | |
| удаляет все элементы, соответствующие определённым критериям (шаблон функции) | |
Ввод/вывод | |
| выполняет потоковый ввод и вывод для строк (шаблон функции) | |
| считывает данные из потока ввода-вывода в строку (шаблон функции) | |
Числовые преобразования | |
| (C++11)(C++11)(C++11) |
преобразует строку в целое число со знаком (функция) |
| (C++11)(C++11) |
преобразует строку в целое число без знака (функция) |
| (C++11)(C++11)(C++11) |
преобразует строку в значение с плавающей запятой (функция) |
| (C++11) |
преобразует целое значение или значение с плавающей запятой в string (функция) |
| (C++11) |
преобразует целое значение или значение с плавающей запятой в wstring (функция) |
[править] Литералы
| Определены в пространстве имён
std::literals::string_literals | |
| (C++14) |
Преобразует литерал символьного массива в basic_string (функция) |
[править] Вспомогательные классы
| (C++11)(C++20)(C++11)(C++11)(C++11)(C++17)(C++20)(C++17)(C++17)(C++17) |
поддержка хэширования для строк (специализация шаблона класса) |
[править] Правила вывода (начиная с C++17)
[править] Примечание
Хотя до C++23 требуется, чтобы настраиваемые construct или destroy использовались при создании или уничтожении элементов std::basic_string, все реализации использовали только механизм по умолчанию. Требование исправлено P1072R10, чтобы соответствовать существующей практике.
| Макрос тест функциональности | Значение | Стандарт | Комментарий |
|---|---|---|---|
__cpp_lib_string_udls |
201304L | (C++14) | Определяемые пользователем литералы для строковых типов |
__cpp_lib_string_contains |
202011L | (C++23) | contains
|
__cpp_lib_string_resize_and_overwrite |
202110L | (C++23) | resize_and_overwrite
|
__cpp_lib_containers_ranges |
202202L | (C++23) | Функции-элементы для создания, вставки и замены, которые принимают no section name |
[править] Пример
#include <iostream> #include <string> int main() { using namespace std::literals; // Создание строки из const char* std::string str1 = "привет"; // Создание строки с использованием строкового литерала auto str2 = "мир"s; // Объединение строк std::string str3 = str1 + " " + str2; // Вывод результата std::cout << str3 << '\n'; std::string::size_type pos = str3.find(" "); str1 = str3.substr(pos + 1); // часть после пробела str2 = str3.substr(0, pos); // часть до пробела std::cout << str1 << ' ' << str2 << '\n'; // Доступ к элементу с помощью индексации через operator[] std::cout << str1[0] << '\n'; str1[0] = 'М'; std::cout << str1 << '\n'; }
Вывод:
привет мир мир привет м Мир
[править] Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| LWG 530 | C++98 | непрерывность хранилища для элементов basic_string не требовалась
|
требуется |
[править] Смотрите также
| (C++17) |
строковое представление только для чтения (шаблон класса) |

