Spec-Zone.ru › C++

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 хранит последовательности объектов, подобных символьным, то есть объектов, не являющихся массивами, типов TrivialType и StandardLayoutType, и предоставляет средства для работы с ними. Класс не зависит ни от типа символов, ни от характера операций над этим типом. Определения операций задаются параметром шаблона Traits — специализацией std::char_traits или совместимым классом traits.

Элементы 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 (за исключением того, что пользовательские construct/destroy не используются для конструирования и разрушения элементов) и SequenceContainer и ContiguousContainer(начиная с C++17).

Программа некорректна, если Traits::char_type не является CharT или Allocator::value_type не является CharT.

Все функции-члены std::basic_string являются constexpr: объекты std::basic_string можно создавать и использовать при вычислении константного выражения.

Однако определение переменной std::basic_string с квалификатором constexpr обычно приводит к ошибке, поскольку при константном вычислении вся динамически выделенная память должна быть освобождена в ходе того же вычисления, чего обычно не происходит с инициализатором std::basic_string.

(начиная с 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 - класс traits, задающий операции над типом символов
Allocator - тип Allocator, используемый для выделения внутреннего хранилища

Инвалидация итераторов

Ссылки, указатели и итераторы, указывающие на элементы basic_string, могут стать недействительными при вызове любой функции стандартной библиотеки, принимающей в качестве аргумента ссылку на неконстантный basic_string, например std::getline, std::swap или operator>>, а также при вызове неконстантных функций-членов, за исключением operator[], at, data, front, back, begin, rbegin, end и rend.

Вложенные типы

Тип Определение
traits_type Traits
value_type CharT
allocator_type Allocator
size_type
Allocator::size_type (до C++11)
std::allocator_traits<Allocator>::size_type (начиная с C++11)
difference_type
Allocator::difference_type (до C++11)
std::allocator_traits<Allocator>::difference_type (начиная с C++11)
reference value_type&
const_reference constvalue_type&
pointer

Allocator::pointer

(до C++11)

std::allocator_traits<Allocator>::pointer

(начиная с C++11)
const_pointer

Allocator::const_pointer

(до C++11)

std::allocator_traits<Allocator>::const_pointer

(начиная с C++11)
iterator

LegacyRandomAccessIterator и LegacyContiguousIterator для value_type

(до C++20)

LegacyRandomAccessIterator, contiguous_iterator и ConstexprIterator для value_type

(начиная с C++20)
const_iterator

LegacyRandomAccessIterator и LegacyContiguousIterator для constvalue_type

(до C++20)

LegacyRandomAccessIterator, contiguous_iterator и ConstexprIterator для constvalue_type

(начиная с C++20)
reverse_iterator std::reverse_iterator<iterator>
const_reverse_iterator std::reverse_iterator<const_iterator>

Члены-данные

constexprsize_type npos [static] специальное значение size_type(-1), точное значение которого зависит от контекста

Функции-члены

(constructor)
создаёт basic_string
(открытая функция-член)
(destructor)
уничтожает строку, освобождая внутреннее хранилище, если оно использовалось
(открытая функция-член)
operator=
присваивает значения строке
(открытая функция-член)
assign
присваивает символы строке
(открытая функция-член)
assign_range
(C++23)
присваивает строке диапазон символов
(открытая функция-член)
get_allocator
возвращает связанный распределитель памяти
(открытая функция-член)
Доступ к элементам
at
осуществляет доступ к указанному символу с проверкой границ
(открытая функция-член)
operator[]
осуществляет доступ к указанному символу
(открытая функция-член)
front
(DR*)
осуществляет доступ к первому символу
(открытая функция-член)
back
(DR*)
осуществляет доступ к последнему символу
(открытая функция-член)
data
возвращает указатель на первый символ строки
(открытая функция-член)
c_str
возвращает неизменяемую версию строки в виде стандартного массива символов C
(открытая функция-член)
operator basic_string_view
(C++17)
возвращает неизменяемое представление basic_string_view всей строки
(открытая функция-член)
Итераторы
begincbegin
(C++11)
возвращает итератор на начало
(открытая функция-член)
endcend
(C++11)
возвращает итератор на конец
(открытая функция-член)
rbegincrbegin
(C++11)
возвращает обратный итератор на начало
(открытая функция-член)
rendcrend
(C++11)
возвращает обратный итератор на конец
(открытая функция-член)
Ёмкость
empty
проверяет, пуста ли строка
(открытая функция-член)
sizelength
возвращает количество символов
(открытая функция-член)
max_size
возвращает максимальное количество символов
(открытая функция-член)
reserve
резервирует память
(открытая функция-член)
capacity
возвращает количество символов, которое может храниться в уже выделенной памяти
(открытая функция-член)
shrink_to_fit
(DR*)
уменьшает использование памяти, освобождая неиспользуемую память
(открытая функция-член)
Модификаторы
clear
очищает содержимое
(открытая функция-член)
insert
вставляет символы
(открытая функция-член)
insert_range
(C++23)
вставляет диапазон символов
(открытая функция-член)
erase
удаляет символы
(открытая функция-член)
push_back
добавляет символ в конец
(открытая функция-член)
pop_back
(DR*)
удаляет последний символ
(открытая функция-член)
append
добавляет символы в конец
(открытая функция-член)
append_range
(C++23)
добавляет диапазон символов в конец
(открытая функция-член)
operator+=
добавляет символы в конец
(открытая функция-член)
replace
заменяет указанную часть строки
(открытая функция-член)
replace_with_range
(C++23)
заменяет указанную часть строки диапазоном символов
(открытая функция-член)
copy
копирует символы
(открытая функция-член)
resize
изменяет количество хранящихся символов
(открытая функция-член)
resize_and_overwrite
(C++23)
изменяет количество хранящихся символов и, возможно, перезаписывает неопределённое содержимое с помощью предоставленной пользователем операции
(открытая функция-член)
swap
обменивает содержимое
(открытая функция-член)
Поиск
find
находит первое вхождение заданной подстроки
(открытая функция-член)
rfind
находит последнее вхождение подстроки
(открытая функция-член)
find_first_of
находит первое вхождение символов
(открытая функция-член)
find_first_not_of
находит первое отсутствие символов
(открытая функция-член)
find_last_of
находит последнее вхождение символов
(открытая функция-член)
find_last_not_of
находит последнее отсутствие символов
(открытая функция-член)
Операции
compare
сравнивает две строки
(открытая функция-член)
starts_with
(C++20)
проверяет, начинается ли строка с заданного префикса
(открытая функция-член)
ends_with
(C++20)
проверяет, заканчивается ли строка заданным суффиксом
(открытая функция-член)
contains
(C++23)
проверяет, содержит ли строка заданную подстроку или символ
(открытая функция-член)
substr
возвращает подстроку
(открытая функция-член)
subview
(C++26)
возвращает подвид
(открытая функция-член)

Функции, не являющиеся членами

operator+
объединяет две строки, строку и char или строку и string_view
(шаблон функции)
operator==operator!=operator<operator>operator<=operator>=operator<=>
(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(C++20)
сравнивает две строки лексикографически
(шаблон функции)
std::swap(std::basic_string)
специализирует алгоритм std::swap
(шаблон функции)
erase(std::basic_string)erase_if(std::basic_string)
(C++20)
удаляет все элементы, удовлетворяющие заданным критериям
(шаблон функции)
Ввод/вывод
operator<<operator>>
выполняет потоковый ввод и вывод строк
(шаблон функции)
getline
считывает данные из потока ввода-вывода в строку
(шаблон функции)
Преобразования чисел
stoistolstoll
(C++11)(C++11)(C++11)
преобразует строку в целое число со знаком
(функция)
stoulstoull
(C++11)(C++11)
преобразует строку в целое число без знака
(функция)
stofstodstold
(C++11)(C++11)(C++11)
преобразует строку в значение с плавающей точкой
(функция)
to_string
(C++11)
преобразует целочисленное значение или значение с плавающей точкой в string
(функция)
to_wstring
(C++11)
преобразует целочисленное значение или значение с плавающей точкой в wstring
(функция)

Литералы

Определён в inline-пространстве имён std::literals::string_literals
operator""s
(C++14)
преобразует строковый литерал в виде массива символов в basic_string
(функция)

Вспомогательные классы

std::hash<std::basic_string>
(C++11)
поддержка хеширования строк
(специализация шаблона класса)

Руководства по выводу типов (начиная с C++17)

Примечания

Хотя до C++23 требовалось использовать пользовательские construct или destroy при создании или уничтожении элементов std::basic_string, все реализации использовали только механизм по умолчанию. Это требование исправлено в P1072R10 в соответствии с существующей практикой.

Макрос проверки поддержки возможности Значение Стандарт Возможность
__cpp_lib_string_udls 201304L (C++14) Пользовательские литералы для строковых типов
__cpp_lib_starts_ends_with 201711L (C++20) starts_with, ends_with
__cpp_lib_constexpr_string 201907L (C++20) Constexpr для std::basic_string
__cpp_lib_char8_t 201907L (C++20) std::u8string
__cpp_lib_erase_if 202002L (C++20) erase, erase_if
__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) Функции-члены для создания, вставки и замены, принимающие диапазон, совместимый с контейнером

Пример

#include <iostream>
#include <string>

int main()
{
    using namespace std::literals;
    
    // Creating a string from const char*
    std::string str1 = "hello";
    
    // Creating a string using string literal
    auto str2 = "world"s;
    
    // Concatenating strings
    std::string str3 = str1 + " " + str2;
    
    // Print out the result
    std::cout << str3 << '\n';
    
    std::string::size_type pos = str3.find(" ");
    str1 = str3.substr(pos + 1); // the part after the space
    str2 = str3.substr(0, pos);  // the part till the space
    
    std::cout << str1 << ' ' << str2 << '\n';
    
    // Accessing an element using subscript operator[]
    std::cout << str1[0] << '\n';
    str1[0] = 'W';
    std::cout << str1 << '\n';
}

Вывод:

hello world
world hello
w
World

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.

DR Применён к Опубликованное поведение Исправленное поведение
LWG 530 C++98 непрерывность хранения элементов basic_string
по ошибке перестала быть обязательной из-за LWG259
снова является обязательной
LWG 2861 C++98 value_type было Traits::char_type изменено на CharT
LWG 2994
(P1148R0)
C++98 поведение не определено, если любое из Traits::char_type[1]
и Allocator::char_type отличается от CharT
в этом случае программа
некорректна
  1. Случай Traits::char_type исправлен в P1148R0.

См. также

basic_string_view
(C++17)
представление строки только для чтения
(шаблон класса)

Внешние ссылки

Обработка строк в C++

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/string/basic_string

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API