Namespaces
Variants

std::basic_string

на сайте ru.cppreference.net
 
 
 
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, программа считается некорректной.

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

Однако определение переменной constexpr std::basic_string обычно является ошибкой, поскольку константное вычисление требует, чтобы любая динамически выделенная память была освобождена в том же вычислении, что обычно не так с инициализатором 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 - класс характеристик, определяющий операции над типом символа
Allocator - Allocator тип, используемый для выделения внутренней памяти

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

Тип Определение
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 const value_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 для const value_type

(до C++20)

LegacyRandomAccessIterator , contiguous_iterator , и ConstexprIterator для const value_type

(начиная с C++20)
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)
присваивает значения строке
(публичная функция-член)
присвоить символы строке
(публичная функция-член)
присваивает диапазон символов строке
(публичная функция-член)
возвращает связанный аллокатор
(публичная функция-член)
Доступ к элементам
обращается к указанному символу с проверкой границ
(публичная функция-член)
обращается к указанному символу
(публичная функция-член)
( DR* )
обращается к первому символу
(публичная функция-член)
( DR* )
обращается к последнему символу
(публичная функция-член)
возвращает указатель на первый символ строки
(public member function)
возвращает немодифицируемую версию строки в виде массива символов стандартного C
(public member function)
возвращает неизменяемое basic_string_view для всей строки
(публичная функция-член)
Итераторы
возвращает итератор на начало
(публичная функция-член)
(C++11)
возвращает итератор на конец
(публичная функция-член)
возвращает обратный итератор на начало
(публичная функция-член)
(C++11)
возвращает обратный итератор на конец
(публичная функция-член)
Ёмкость
проверяет, является ли строка пустой
(публичная функция-член)
возвращает количество символов
(публичная функция-член)
возвращает максимальное количество символов
(публичная функция-член)
резервирует память
(публичная функция-член)
возвращает количество символов, которое может содержаться в текущем выделенном хранилище
(публичная функция-член)
уменьшает использование памяти за счет освобождения неиспользуемой памяти
(публичная функция-член)
Модификаторы
очищает содержимое
(публичная функция-член)
вставляет символы
(публичная функция-член)
вставляет диапазон символов
(публичная функция-член)
удаляет символы
(публичная функция-член)
добавляет символ в конец
(public member function)
( DR* )
удаляет последний символ
(public member function)
добавляет символы в конец
(публичная функция-член)
добавляет диапазон символов в конец
(публичная функция-член)
добавляет символы в конец
(публичная функция-член)
заменяет указанную часть строки
(публичная функция-член)
заменяет указанную часть строки диапазоном символов
(публичная функция-член)
копирует символы
(публичная функция-член)
изменяет количество хранимых символов
(публичная функция-член)
изменяет количество хранимых символов и возможно перезаписывает неопределённое содержимое через предоставленную пользователем операцию
(публичная функция-член)
обменивает содержимое
(публичная функция-член)
Поиск
находит первое вхождение заданной подстроки
(public member function)
найти последнее вхождение подстроки
(публичная функция-член)
найти первое вхождение символов
(публичная функция-член)
найти первое отсутствие символов
(публичная функция-член)
найти последнее вхождение символов
(публичная функция-член)
найти последнее отсутствие символов
(публичная функция-член)
Операции
сравнивает две строки
(публичная функция-элемент)
проверяет, начинается ли строка с указанного префикса
(публичная функция-элемент)
(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
преобразует литерал символьного массива в basic_string
(функция)

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

поддержка хеширования для строк
(специализация шаблона класса)

Руководства по выводу (начиная с 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
программа является
некорректной в этом случае
  1. ↑ Случай с Traits::char_type исправлен в P1148R0 .

Смотрите также

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

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

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