Spec-Zone.ru › C++

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::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

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>

Функции-члены

(конструктор)
создаёт basic_string
(общедоступный член-функция)
(деструктор)
уничтожает строку, освобождая внутреннее хранилище, если оно использовалось
(общедоступный член-функция)
operator=
присваивает значения строке
(общедоступный член-функция)
assign
присваивает символы строке
(общедоступный член-функция)
assign_range
(C++23)
присваивает диапазон символов строке
(общедоступный член-функция)
get_allocator
возвращает связанный аллокатор
(общедоступный член-функция)
Доступ к элементам
at
обращается к указанному символу с проверкой границ
(общедоступный член-функция)
operator[]
обращается к указанному символу
(общедоступный член-функция)
front
(DR*)
обращается к первому символу
(общедоступный член-функция)
back
(DR*)
обращается к последнему символу
(общедоступный член-функция)
data
возвращает указатель на первый символ строки
(общедоступный член-функция)
c_str
возвращает немодифицируемый стандартный C-массив символов, представляющий строку
(общедоступный член-функция)
operator basic_string_view
(C++17)
возвращает немодифицируемый string_view на всю строку
(общедоступный член-функция)
Итераторы
begincbegin
(DR*)
возвращает итератор в начало
(общедоступный член-функция)
endcend
(DR*)
возвращает итератор в конец
(общедоступный член-функция)
rbegincrbegin
(DR*)
возвращает обратный итератор в начало
(общедоступный член-функция)
rendcrend
(DR*)
возвращает обратный итератор в конец
(общедоступный член-функция)
Ёмкость
empty
проверяет, пуста ли строка
(общедоступный член-функция)
sizelength
возвращает количество символов
(общедоступный член-функция)
max_size
возвращает максимальное количество символов
(общедоступный член-функция)
reserve
резервирует хранилище
(общедоступный член-функция)
capacity
возвращает количество символов, которые могут быть размещены в текущем выделенном хранилище
(общедоступный член-функция)
shrink_to_fit
(DR*)
уменьшает использование памяти, освобождая неиспользуемую память
(общедоступный член-функция)
Изменяющие методы
clear
очищает содержимое
(общедоступный член-функция)
insert
вставляет символы
(общедоступный член-функция)
insert_range
(C++23)
вставляет диапазон символов
(общедоступный член-функция)
erase
удаляет символы
(общедоступный член-функция)
push_back
добавляет символ в конец
(общедоступный член-функция)
pop_back
(DR*)
удаляет последний символ
(общедоступный член-функция)
append
добавляет символы в конец
(общедоступный член-функция)
append_range
(C++23)
добавляет диапазон символов в конец
(общедоступный член-функция)
operator+=
добавляет символы в конец
(общедоступный член-функция)
replace
заменяет указанный фрагмент строки
(общедоступный член-функция)
replace_with_range
(C++23)
заменяет указанный фрагмент строки диапазоном символов
(общедоступный член-функция)
copy
копирует символы
(общедоступный член-функция)
resize
изменяет количество хранимых символов
(общедоступный член-функция)
resize_and_overwrite
(C++23)
изменяет количество хранимых символов и, возможно, перезаписывает неопределённое содержимое с помощью предоставленной пользователем операции
(общедоступный член-функция)
swap
меняет местами содержимое
(общедоступный член-функция)
Поиск
find
находит первое вхождение заданной подстроки
(общедоступный член-функция)
rfind
находит последнее вхождение подстроки
(общедоступный член-функция)
find_first_of
находит первое вхождение символов
(общедоступный член-функция)
find_first_not_of
находит первое отсутствие символов
(общедоступный член-функция)
find_last_of
находит последнее вхождение символов
(общедоступный член-функция)
find_last_not_of
находит последнее отсутствие символов
(общедоступный член-функция)
Операции
compare
сравнивает две строки
(общедоступный член-функция)
starts_with
(C++20)
проверяет, начинается ли строка с указанного префикса
(общедоступный член-функция)
ends_with
(C++20)
проверяет, заканчивается ли строка указанным суффиксом
(общедоступный член-функция)
contains
(C++23)
проверяет, содержит ли строка заданную подстроку или символ
(общедоступный член-функция)
substr
возвращает подстроку
(общедоступный член-функция)

Константы

npos
[статический]
специальное значение. Точное значение зависит от контекста
(общедоступная статическая константа-член)

Функции, не являющиеся членами

operator+
конкатенирует две строки или строку и char
(шаблон функции)
operator==operator!=operator<operator>operator<=operator>=operator<=>
(удалено в C++20)(удалено в C++20)(удалено в C++20)(удалено в C++20)(удалено в C++20)(C++20)
лексикографически сравнивает две строки
(шаблон функции)
std::swap(std::basic_string)
специализирует алгоритм std::swap
(шаблон функции)
erase(std::basic_string)erase_if(std::basic_string)
(C++20)
удаляет все элементы, удовлетворяющие определённым критериям
(шаблон функции)
Ввод/вывод
operator<<operator>>
выполняет потоковый ввод и вывод строк
(шаблон функции)
getline
считывает данные из потока ввода/вывода в строку
(шаблон функции)
Числовые преобразования
stoistolstoll
(C++11)(C++11)(C++11)
преобразует строку в целое со знаком
(функция)
stoulstoull
(C++11)(C++11)
преобразует строку в целое без знака
(функция)
stofstodstold
(C++11)(C++11)(C++11)
преобразует строку в значение с плавающей точкой
(функция)
to_string
(C++11)
преобразует целое или значение с плавающей точкой в string
(функция)
to_wstring
(C++11)
преобразует целое или значение с плавающей точкой в wstring
(функция)

Литералы

Определено в вложенном пространстве имён std::literals::string_literals
operator""s
(C++14)
преобразует литерал массива символов в basic_string
(функция)

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

std::hash<std::basic_string>
(C++11)
поддержка хеширования для строк
(специализация шаблона класса)

Руководства по выводу (с C++17)

Примечания

Хотя требуется, чтобы настраиваемые construct или destroy использовались при создании или уничтожении элементов std::basic_string до C++23, все реализации использовали только механизм по умолчанию. Требование исправлено в 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) Константное выражение для 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;
 
    // Creating a string from const char*
    std::string str1 = "hello";
 
    // Creating a string using string literal
    auto str2 = "world"s;
 
    // Concatenating strings
    std::string str3 = str1 + " " + str2;
 
    // Print out the result
    std::cout << str3 << '\n';
 
    std::string::size_type pos = str3.find(" ");
    str1 = str3.substr(pos + 1); // the part after the space
    str2 = str3.substr(0, pos);  // the part till the space
 
    std::cout << str1 << ' ' << str2 << '\n';
 
    // Accessing an element using subscript operator[]
    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 Требовалось
LWG 2994
(P1148R0)
C++98 Поведение не определено, если любой из Traits::char_type[1]
и Allocator::char_type отличается от CharT
Программа
некорректна в этом случае
  1. Случай Traits::char_type исправлен в P1148R0.

См. также

basic_string_view
(C++17)
только для чтения строковый вид
(шаблон класса)

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

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/string/basic_string

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API