std:: basic_string
|
Определено в заголовочном файле
<string>
|
||
|
template
<
class
CharT,
|
(1) | |
|
namespace
pmr
{
template
<
|
(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::value_type
отличается от
CharT
, программа является некорректной.
Все функции-члены
std::basic_string
являются
constexpr
: возможно создавать и использовать объекты
std::basic_string
при вычислении константного выражения.
Однако, объекты
|
(since C++20) |
Предоставлены несколько typedef для распространённых символьных типов:
|
Определено в заголовочном файле
<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)
|
проверяет, начинается ли строка с заданного префикса
(public member function) |
|
(C++20)
|
проверяет, заканчивается ли строка заданным суффиксом
(публичная функция-член) |
|
(C++23)
|
проверяет, содержит ли строка заданную подстроку или символ
(публичная функция-член) |
|
возвращает подстроку
(публичная функция-член) |
|
Функции, не являющиеся членами класса
|
объединяет две строки, строку и
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++ |