std::basic_string
| Определено в заголовочном файле <string>
|
||
template< class CharT, class Traits = std::char_traits<CharT>, class Allocator = std::allocator<CharT> > class basic_string; |
(1) | |
namespace pmr { template <class CharT, class Traits = std::char_traits<CharT>> using basic_string = std::basic_string< CharT, Traits, std::pmr::polymorphic_allocator<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) |
строковое представление только для чтения (шаблон класса) |