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 > |
Члены данных
constexpr
size_type
npos
[static]
|
специальное значение size_type ( - 1 ) , точное значение которого зависит от контекста |
Функции-члены
создаёт объект
basic_string
(публичная функция-член) |
|
|
уничтожает строку, освобождая внутреннее хранилище, если оно использовалось
(public member function) |
|
|
присваивает значения строке
(публичная функция-член) |
|
|
присвоить символы строке
(публичная функция-член) |
|
|
(C++23)
|
присваивает диапазон символов строке
(публичная функция-член) |
|
возвращает связанный аллокатор
(публичная функция-член) |
|
Доступ к элементам |
|
|
обращается к указанному символу с проверкой границ
(публичная функция-член) |
|
|
обращается к указанному символу
(публичная функция-член) |
|
|
(
DR*
)
|
обращается к первому символу
(публичная функция-член) |
|
(
DR*
)
|
обращается к последнему символу
(публичная функция-член) |
|
возвращает указатель на первый символ строки
(public member function) |
|
|
возвращает немодифицируемую версию строки в виде массива символов стандартного C
(public member function) |
|
|
(C++17)
|
возвращает неизменяемое
basic_string_view
для всей строки
(публичная функция-член) |
Итераторы |
|
|
(C++11)
|
возвращает итератор на начало
(публичная функция-член) |
|
(C++11)
|
возвращает итератор на конец
(публичная функция-член) |
|
(C++11)
|
возвращает обратный итератор на начало
(публичная функция-член) |
|
(C++11)
|
возвращает обратный итератор на конец
(публичная функция-член) |
Ёмкость |
|
|
проверяет, является ли строка пустой
(публичная функция-член) |
|
|
возвращает количество символов
(публичная функция-член) |
|
|
возвращает максимальное количество символов
(публичная функция-член) |
|
|
резервирует память
(публичная функция-член) |
|
|
возвращает количество символов, которое может содержаться в текущем выделенном хранилище
(публичная функция-член) |
|
|
(
DR*
)
|
уменьшает использование памяти за счет освобождения неиспользуемой памяти
(публичная функция-член) |
Модификаторы |
|
|
очищает содержимое
(публичная функция-член) |
|
|
вставляет символы
(публичная функция-член) |
|
|
(C++23)
|
вставляет диапазон символов
(публичная функция-член) |
|
удаляет символы
(публичная функция-член) |
|
|
добавляет символ в конец
(public member function) |
|
|
(
DR*
)
|
удаляет последний символ
(public member function) |
|
добавляет символы в конец
(публичная функция-член) |
|
|
(C++23)
|
добавляет диапазон символов в конец
(публичная функция-член) |
|
добавляет символы в конец
(публичная функция-член) |
|
|
заменяет указанную часть строки
(публичная функция-член) |
|
|
(C++23)
|
заменяет указанную часть строки диапазоном символов
(публичная функция-член) |
|
копирует символы
(публичная функция-член) |
|
|
изменяет количество хранимых символов
(публичная функция-член) |
|
|
(C++23)
|
изменяет количество хранимых символов и возможно перезаписывает неопределённое содержимое через предоставленную пользователем операцию
(публичная функция-член) |
|
обменивает содержимое
(публичная функция-член) |
|
Поиск |
|
|
находит первое вхождение заданной подстроки
(public member function) |
|
|
найти последнее вхождение подстроки
(публичная функция-член) |
|
|
найти первое вхождение символов
(публичная функция-член) |
|
|
найти первое отсутствие символов
(публичная функция-член) |
|
|
найти последнее вхождение символов
(публичная функция-член) |
|
|
найти последнее отсутствие символов
(публичная функция-член) |
|
Операции | |
| сравнивает две строки (публичная функция-элемент) | |
(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++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)
Инвалидация итераторов
Ссылки, указатели и итераторы, ссылающиеся на элементы
basic_string
, могут быть инвалидированы любой функцией стандартной библиотеки, принимающей ссылку на неконстантную
basic_string
в качестве аргумента, такой как
std::getline
,
std::swap
, или
operator>>
, а также при вызове неконстантных функций-членов, за исключением
operator[]
,
at
,
data
,
front
,
back
,
begin
,
rbegin
,
end
, и
rend
.
Примечания
Хотя до 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; // Создание строки из const char* std::string str1 = "hello"; // Создание строки с использованием строкового литерала auto str2 = "world"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'; // Доступ к элементу с использованием оператора индексации [] 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
|
программа является
некорректной в этом случае |
Смотрите также
|
(C++17)
|
представление строки только для чтения
(шаблон класса) |
Внешние ссылки
| Обработка строк в C++ |