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.
| Все функции-члены Однако определение переменной | (начиная с 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 |
|
||||
difference_type |
|
||||
reference | value_type& | ||||
const_reference | constvalue_type& | ||||
pointer |
|
||||
const_pointer |
|
||||
iterator |
|
||||
const_iterator |
|
||||
reverse_iterator | std::reverse_iterator<iterator> | ||||
const_reverse_iterator | std::reverse_iterator<const_iterator> |
Члены-данные
constexprsize_type npos [static] | специальное значение size_type(-1), точное значение которого зависит от контекста |
Функции-члены
создаёт basic_string (открытая функция-член) |
|
| уничтожает строку, освобождая внутреннее хранилище, если оно использовалось (открытая функция-член) |
|
| присваивает значения строке (открытая функция-член) |
|
| присваивает символы строке (открытая функция-член) |
|
|
(C++23) | присваивает строке диапазон символов (открытая функция-член) |
| возвращает связанный распределитель памяти (открытая функция-член) |
|
Доступ к элементам |
|
| осуществляет доступ к указанному символу с проверкой границ (открытая функция-член) |
|
| осуществляет доступ к указанному символу (открытая функция-член) |
|
|
(DR*) | осуществляет доступ к первому символу (открытая функция-член) |
|
(DR*) | осуществляет доступ к последнему символу (открытая функция-член) |
| возвращает указатель на первый символ строки (открытая функция-член) |
|
| возвращает неизменяемую версию строки в виде стандартного массива символов C (открытая функция-член) |
|
|
(C++17) | возвращает неизменяемое представление basic_string_view всей строки (открытая функция-член) |
Итераторы |
|
|
(C++11) | возвращает итератор на начало (открытая функция-член) |
|
(C++11) | возвращает итератор на конец (открытая функция-член) |
|
(C++11) | возвращает обратный итератор на начало (открытая функция-член) |
|
(C++11) | возвращает обратный итератор на конец (открытая функция-член) |
Ёмкость |
|
| проверяет, пуста ли строка (открытая функция-член) |
|
| возвращает количество символов (открытая функция-член) |
|
| возвращает максимальное количество символов (открытая функция-член) |
|
| резервирует память (открытая функция-член) |
|
| возвращает количество символов, которое может храниться в уже выделенной памяти (открытая функция-член) |
|
|
(DR*) | уменьшает использование памяти, освобождая неиспользуемую память (открытая функция-член) |
Модификаторы |
|
| очищает содержимое (открытая функция-член) |
|
| вставляет символы (открытая функция-член) |
|
|
(C++23) | вставляет диапазон символов (открытая функция-член) |
| удаляет символы (открытая функция-член) |
|
| добавляет символ в конец (открытая функция-член) |
|
|
(DR*) | удаляет последний символ (открытая функция-член) |
| добавляет символы в конец (открытая функция-член) |
|
|
(C++23) | добавляет диапазон символов в конец (открытая функция-член) |
| добавляет символы в конец (открытая функция-член) |
|
| заменяет указанную часть строки (открытая функция-член) |
|
|
(C++23) | заменяет указанную часть строки диапазоном символов (открытая функция-член) |
| копирует символы (открытая функция-член) |
|
| изменяет количество хранящихся символов (открытая функция-член) |
|
|
(C++23) | изменяет количество хранящихся символов и, возможно, перезаписывает неопределённое содержимое с помощью предоставленной пользователем операции (открытая функция-член) |
| обменивает содержимое (открытая функция-член) |
|
Поиск |
|
| находит первое вхождение заданной подстроки (открытая функция-член) |
|
| находит последнее вхождение подстроки (открытая функция-член) |
|
| находит первое вхождение символов (открытая функция-член) |
|
| находит первое отсутствие символов (открытая функция-член) |
|
| находит последнее вхождение символов (открытая функция-член) |
|
| находит последнее отсутствие символов (открытая функция-член) |
|
Операции |
|
| сравнивает две строки (открытая функция-член) |
|
|
(C++20) | проверяет, начинается ли строка с заданного префикса (открытая функция-член) |
|
(C++20) | проверяет, заканчивается ли строка заданным суффиксом (открытая функция-член) |
|
(C++23) | проверяет, содержит ли строка заданную подстроку или символ (открытая функция-член) |
| возвращает подстроку (открытая функция-член) |
|
|
(C++26) | возвращает подвид (открытая функция-член) |
Функции, не являющиеся членами
объединяет две строки, строку и char или строку и string_view (шаблон функции) |
|
|
(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(C++20) | сравнивает две строки лексикографически (шаблон функции) |
специализирует алгоритм std::swap (шаблон функции) |
|
|
(C++20) | удаляет все элементы, удовлетворяющие заданным критериям (шаблон функции) |
Ввод/вывод |
|
| выполняет потоковый ввод и вывод строк (шаблон функции) |
|
| считывает данные из потока ввода-вывода в строку (шаблон функции) |
|
Преобразования чисел |
|
|
(C++11)(C++11)(C++11) | преобразует строку в целое число со знаком (функция) |
|
(C++11)(C++11) | преобразует строку в целое число без знака (функция) |
|
(C++11)(C++11)(C++11) | преобразует строку в значение с плавающей точкой (функция) |
|
(C++11) | преобразует целочисленное значение или значение с плавающей точкой в string (функция) |
|
(C++11) | преобразует целочисленное значение или значение с плавающей точкой в wstring (функция) |
Литералы
Определён в inline-пространстве имён std::literals::string_literals |
|
|---|---|
|
(C++14) | преобразует строковый литерал в виде массива символов в 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 | в этом случае программа некорректна |
- Случай
Traits::char_typeисправлен в P1148R0.
См. также
|
(C++17) | представление строки только для чтения (шаблон класса) |
Внешние ссылки
| Обработка строк в C++ |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/string/basic_string