Namespaces
Variants

std:: basic_string

From 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::value_type отличается от CharT , программа является некорректной.

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

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

(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
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)
найти последнее вхождение подстроки
(публичная функция-член)
найти первое вхождение символов
(публичная функция-член)
найти первое отсутствие символов
(публичная функция-член)
найти последнее вхождение символов
(публичная функция-член)
найти последнее отсутствие символов
(публичная функция-член)
Операции
сравнивает две строки
(публичная функция-член)
проверяет, начинается ли строка с заданного префикса
(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
преобразует литерал символьного массива в 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++