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) |
строковое представление только для чтения (шаблон класса) |