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 или совместимого класса свойств.
Элементы 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 и Allocator::char_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 | - | класс свойств, определяющий операции над типом символа |
| 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 (общедоступный член-функция) |
|
| уничтожает строку, освобождая внутреннее хранилище, если оно использовалось (общедоступный член-функция) |
|
| присваивает значения строке (общедоступный член-функция) |
|
| присваивает символы строке (общедоступный член-функция) |
|
|
(C++23) | присваивает диапазон символов строке (общедоступный член-функция) |
| возвращает связанный аллокатор (общедоступный член-функция) |
|
Доступ к элементам |
|
| обращается к указанному символу с проверкой границ (общедоступный член-функция) |
|
| обращается к указанному символу (общедоступный член-функция) |
|
|
(DR*) | обращается к первому символу (общедоступный член-функция) |
|
(DR*) | обращается к последнему символу (общедоступный член-функция) |
| возвращает указатель на первый символ строки (общедоступный член-функция) |
|
| возвращает немодифицируемый стандартный C-массив символов, представляющий строку (общедоступный член-функция) |
|
|
(C++17) | возвращает немодифицируемый string_view на всю строку (общедоступный член-функция) |
Итераторы |
|
|
(DR*) | возвращает итератор в начало (общедоступный член-функция) |
|
(DR*) | возвращает итератор в конец (общедоступный член-функция) |
|
(DR*) | возвращает обратный итератор в начало (общедоступный член-функция) |
|
(DR*) | возвращает обратный итератор в конец (общедоступный член-функция) |
Ёмкость |
|
| проверяет, пуста ли строка (общедоступный член-функция) |
|
| возвращает количество символов (общедоступный член-функция) |
|
| возвращает максимальное количество символов (общедоступный член-функция) |
|
| резервирует хранилище (общедоступный член-функция) |
|
| возвращает количество символов, которые могут быть размещены в текущем выделенном хранилище (общедоступный член-функция) |
|
|
(DR*) | уменьшает использование памяти, освобождая неиспользуемую память (общедоступный член-функция) |
Изменяющие методы |
|
| очищает содержимое (общедоступный член-функция) |
|
| вставляет символы (общедоступный член-функция) |
|
|
(C++23) | вставляет диапазон символов (общедоступный член-функция) |
| удаляет символы (общедоступный член-функция) |
|
| добавляет символ в конец (общедоступный член-функция) |
|
|
(DR*) | удаляет последний символ (общедоступный член-функция) |
| добавляет символы в конец (общедоступный член-функция) |
|
|
(C++23) | добавляет диапазон символов в конец (общедоступный член-функция) |
| добавляет символы в конец (общедоступный член-функция) |
|
| заменяет указанный фрагмент строки (общедоступный член-функция) |
|
|
(C++23) | заменяет указанный фрагмент строки диапазоном символов (общедоступный член-функция) |
| копирует символы (общедоступный член-функция) |
|
| изменяет количество хранимых символов (общедоступный член-функция) |
|
|
(C++23) | изменяет количество хранимых символов и, возможно, перезаписывает неопределённое содержимое с помощью предоставленной пользователем операции (общедоступный член-функция) |
| меняет местами содержимое (общедоступный член-функция) |
|
Поиск |
|
| находит первое вхождение заданной подстроки (общедоступный член-функция) |
|
| находит последнее вхождение подстроки (общедоступный член-функция) |
|
| находит первое вхождение символов (общедоступный член-функция) |
|
| находит первое отсутствие символов (общедоступный член-функция) |
|
| находит последнее вхождение символов (общедоступный член-функция) |
|
| находит последнее отсутствие символов (общедоступный член-функция) |
|
Операции |
|
| сравнивает две строки (общедоступный член-функция) |
|
|
(C++20) | проверяет, начинается ли строка с указанного префикса (общедоступный член-функция) |
|
(C++20) | проверяет, заканчивается ли строка указанным суффиксом (общедоступный член-функция) |
|
(C++23) | проверяет, содержит ли строка заданную подстроку или символ (общедоступный член-функция) |
| возвращает подстроку (общедоступный член-функция) |
|
Константы |
|
|
[статический] | специальное значение. Точное значение зависит от контекста (общедоступная статическая константа-член) |
Функции, не являющиеся членами
| конкатенирует две строки или строку и char (шаблон функции) |
|
|
(удалено в 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 (функция) |
Литералы
Определено в вложенном пространстве имён std::literals::string_literals |
|
|---|---|
|
(C++14) | преобразует литерал массива символов в basic_string (функция) |
Вспомогательные классы
|
(C++11) | поддержка хеширования для строк (специализация шаблона класса) |
Руководства по выводу (с C++17)
Примечания
Хотя требуется, чтобы настраиваемые construct или destroy использовались при создании или уничтожении элементов std::basic_string до C++23, все реализации использовали только механизм по умолчанию. Требование исправлено в 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) | Константное выражение для 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 | Требовалось |
|
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/w/cpp/string/basic_string