Пространства имён
Варианты
Действия

std::basic_string

Материал из cppreference.com
< cpp‎ | string
 
 
 
std::basic_string
Функции-элементы
Доступ к элементам
Итераторы
Ёмкость
Операции
Поиск
Константы
Правила вывода (C++17)
Функции, не являющиеся элементами
Ввод/Вывод
Сравнение
(до C++20)(до C++20)(до C++20)(до C++20)(до C++20)(C++20)
Числовые преобразования
(C++11)(C++11)(C++11)
(C++11)(C++11)
(C++11)(C++11)(C++11)
(C++11)
(C++11)
Вспомогательные классы
 
Определено в заголовочном файле <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 хранит и управляет последовательностями char-подобных объектов, которые не являются объектами массива тривиального типа стандартной компоновки. Класс не зависит ни от типа символа, ни от характера операций с этим типом. Определения операций предоставляются через параметр шаблона Traits - специализацию std::char_traits или совместимого класса свойств. Traits::char_type и CharT должны именовать один и тот же тип; иначе программа будет некорректной.

Элементы basic_string хранятся непрерывно, то есть для basic_string s, &*(s.begin() + n) == &*s.begin() + n для любого n в [0s.size()), и *(s.begin() + s.size()) имеет значение CharT() (нулевой терминатор) (начиная с C++11); или, что то же самое, указатель на s[0] может быть передан функциям, которые ожидают указатель на первый элемент массива (до C++11)массива, заканчивающегося нулём (начиная с C++11) элементов CharT.

std::basic_string соответствует требованиям AllocatorAwareContainer, SequenceContainer и ContiguousContainer (начиная с C++17)

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

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

(начиная с 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

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>[править]

[править] Функции элементы

создаёт basic_string
(public функция-элемент) [править]
уничтожает строку, освобождая внутреннюю память, если она используется
(public функция-элемент) [править]
присваивает значения строке
(public функция-элемент) [править]
присваивает символы строке
(public функция-элемент) [править]
присваивает диапазон символов строке
(public функция-элемент) [править]
возвращает связанный аллокатор
(public функция-элемент) [править]
Доступ к элементам
обращается к указанному символу с проверкой границ
(public функция-элемент) [править]
получает доступ к указанному символу
(public функция-элемент) [править]
(DR*)
получает доступ к первому символу
(public функция-элемент) [править]
(DR*)
получает доступ к последнему символу
(public функция-элемент) [править]
возвращает указатель на первый символ строки
(public функция-элемент) [править]
возвращает немодифицируемую стандартную версию массива символов C строки
(public функция-элемент) [править]
возвращает неизменяемый string_view всей строки
(public функция-элемент) [править]
Итераторы
возвращает итератор на начало
(public функция-элемент) [править]
возвращает итератор на конец
(public функция-элемент) [править]
возвращает обратный итератор на начало
(public функция-элемент) [править]
возвращает обратный итератор на конец
(public функция-элемент) [править]
Вместимость
проверяет, пуста ли строка
(public функция-элемент) [править]
возвращает количество символов
(public функция-элемент) [править]
возвращает максимальное количество символов
(public функция-элемент) [править]
резервирует память
(public функция-элемент) [править]
возвращает количество символов, которые могут храниться в выделенной в данный момент памяти
(public функция-элемент) [править]
уменьшает использование памяти за счёт освобождения неиспользуемой памяти
(public функция-элемент) [править]
Операции
очищает содержимое
(public функция-элемент) [править]
вставляет символы
(public функция-элемент) [править]
вставляет диапазон символов
(public функция-элемент) [править]
удаляет символы
(public функция-элемент) [править]
добавляет символ в конец
(public функция-элемент) [править]
удаляет последний символ
(public функция-элемент) [править]
добавляет символы в конец
(public функция-элемент) [править]
добавляет диапазон символов в конец
(public функция-элемент) [править]
добавляет символы в конец
(public функция-элемент) [править]
сравнивает две строки
(public функция-элемент) [править]
проверяет, начинается ли строка с заданного префикса
(public функция-элемент) [править]
(C++20)
проверяет, заканчивается ли строка заданным суффиксом
(public функция-элемент) [править]
(C++23)
проверяет, содержит ли строка данную подстроку или символ
(public функция-элемент) [править]
заменяет указанную часть строки
(public функция-элемент) [править]
заменяет указанную часть строки диапазоном символов
(public функция-элемент) [править]
возвращает подстроку
(public функция-элемент) [править]
копирует символы
(public функция-элемент) [править]
изменяет количество сохранённых символов
(public функция-элемент) [править]
изменяет количество сохранённых символов и, возможно, перезаписывает неопределённое содержимое с помощью операции, предоставляемой пользователем
(public функция-элемент) [править]
меняет местами содержимое
(public функция-элемент) [править]
Поиск
находит первое вхождение заданной подстроки
(public функция-элемент) [править]
ищет последнее вхождение подстроки
(public функция-элемент) [править]
ищет первое вхождение символов
(public функция-элемент) [править]
ищет первое отсутствие символов
(public функция-элемент) [править]
ищет последнее вхождение символов
(public функция-элемент) [править]
ищет последнее отсутствие символов
(public функция-элемент) [править]

Константы

[static]
специальное значение. Точное значение зависит от контекста
(public static константа-элемент) [править]

[править] Функции, не являющиеся элементами

объединяет две строки или строку и символ
(шаблон функции) [править]
(удалено в 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
(функция) [править]
преобразует целое значение или значение с плавающей запятой в wstring
(функция) [править]

[править] Литералы

Определены в пространстве имён std::literals::string_literals
Преобразует литерал символьного массива в basic_string
(функция) [править]

[править] Вспомогательные классы

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

[править] Правила вывода (начиная с C++17)

[править] Примечание

Хотя до C++23 требуется, чтобы настраиваемые construct или destroy использовались при создании или уничтожении элементов std::basic_string, все реализации использовали только механизм по умолчанию. Требование исправлено P1072R10, чтобы соответствовать существующей практике.

Макрос тест функциональности Значение Стандарт Комментарий
__cpp_lib_string_udls 201304L (C++14) Определяемые пользователем литералы для строковых типов
__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) Функции-элементы для создания, вставки и замены, которые принимают no section name

[править] Пример

#include <iostream>
#include <string>
 
int main()
{
    using namespace std::literals;
 
    // Создание строки из const char*
    std::string str1 = "привет";
 
    // Создание строки с использованием строкового литерала
    auto str2 = "мир"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';
 
    // Доступ к элементу с помощью индексации через operator[]
    std::cout << str1[0] << '\n';
    str1[0] = 'М';
    std::cout << str1 << '\n';
}

Вывод:

привет мир
мир привет
м
Мир

[править] Отчёты о дефектах

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

Номер Применён Поведение в стандарте Корректное поведение
LWG 530 C++98 непрерывность хранилища для элементов basic_string не требовалась требуется

[править] Смотрите также

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