Namespaces
Variants

std::basic_string<CharT,Traits,Allocator>:: basic_string

From cppreference.net
std::basic_string
(1)
basic_string ( ) : basic_string ( Allocator ( ) ) { }
(начиная с C++11)
(до C++17)
basic_string ( ) noexcept ( noexcept ( Allocator ( ) ) )
: basic_string ( Allocator ( ) ) { }
(начиная с C++17)
(constexpr начиная с C++20)
(2)
explicit basic_string ( const Allocator & alloc = Allocator ( ) ) ;
(до C++11)
explicit basic_string ( const Allocator & alloc ) ;
(noexcept начиная с C++17)
(constexpr начиная с C++20)
basic_string ( size_type count, CharT ch,
const Allocator & alloc = Allocator ( ) ) ;
(3) (constexpr начиная с C++20)
template < class InputIt >

basic_string ( InputIt first, InputIt last,

const Allocator & alloc = Allocator ( ) ) ;
(4) (constexpr начиная с C++20)
template < container-compatible-range < CharT > R >

constexpr basic_string ( std:: from_range_t , R && rg,

const Allocator & = Allocator ( ) ) ;
(5) (начиная с C++23)
basic_string ( const CharT * s, size_type count,
const Allocator & alloc = Allocator ( ) ) ;
(6) (constexpr начиная с C++20)
basic_string ( const CharT * s, const Allocator & alloc = Allocator ( ) ) ;
(7) (constexpr начиная с C++20)
basic_string ( std:: nullptr_t ) = delete ;
(8) (начиная с C++23)
template < class StringViewLike >

explicit basic_string ( const StringViewLike & t,

const Allocator & alloc = Allocator ( ) ) ;
(9) (начиная с C++17)
(constexpr начиная с C++20)
template < class StringViewLike >

basic_string ( const StringViewLike & t,
size_type pos, size_type count,

const Allocator & alloc = Allocator ( ) ) ;
(10) (начиная с C++17)
basic_string ( const basic_string & other ) ;
(11) (constexpr начиная с C++20)
basic_string ( basic_string && other ) noexcept ;
(12) (начиная с C++11)
(constexpr начиная с C++20)
basic_string ( const basic_string & other, const Allocator & alloc ) ;
(13) (начиная с C++11)
(constexpr начиная с C++20)
basic_string ( basic_string && other, const Allocator & alloc ) ;
(14) (начиная с C++11)
(constexpr начиная с C++20)
basic_string ( const basic_string & other, size_type pos,
const Allocator & alloc = Allocator ( ) ) ;
(15) (constexpr начиная с C++20)
constexpr basic_string ( basic_string && other, size_type pos,
const Allocator & alloc = Allocator ( ) ) ;
(16) (начиная с C++23)
basic_string ( const basic_string & other,

size_type pos, size_type count,

const Allocator & alloc = Allocator ( ) ) ;
(17) (constexpr начиная с C++20)
constexpr basic_string ( basic_string && other,

size_type pos, size_type count,

const Allocator & alloc = Allocator ( ) ) ;
(18) (начиная с C++23)
basic_string ( std:: initializer_list < CharT > ilist,
const Allocator & alloc = Allocator ( ) ) ;
(19) (начиная с C++11)
(constexpr начиная с C++20)

Создает новую строку из различных источников данных и, опционально, используя предоставленный пользователем аллокатор alloc .

1) Конструктор по умолчанию, начиная с C++11. Создает пустую строку с аллокатором, сконструированным по умолчанию.
Если Allocator не является DefaultConstructible , поведение не определено.
2) Конструктор по умолчанию до C++11. Создает пустую строку с заданным аллокатором alloc .
3) Создает строку с count копиями символа ch .

Если CharT не является CopyInsertable в std:: basic_string < CharT > , поведение не определено.

(since C++11)

Эта перегрузка участвует в разрешении перегрузки только если Allocator удовлетворяет требованиям Allocator .

(since C++17)
4) Создает строку с содержимым диапазона [ first , last ) . Каждый итератор в [ first , last ) разыменовывается ровно один раз.

Если InputIt не удовлетворяет требованиям LegacyInputIterator , вместо этого вызывается перегрузка (3) с аргументами static_cast < size_type > ( first ) , last и alloc .

(до C++11)

Эта перегрузка участвует в разрешении перегрузки только если InputIt удовлетворяет требованиям LegacyInputIterator .

Если CharT не является EmplaceConstructible в std:: basic_string < CharT > из * first , поведение не определено.

(начиная с C++11)
5) Создает строку с содержимым диапазона rg . Каждый итератор в rg разыменовывается ровно один раз.
Если CharT не является EmplaceConstructible в std:: basic_string < CharT > из * ranges:: begin ( rg ) , поведение не определено.
6) Создает строку с содержимым диапазона [ s , s + count ) .
Если [ s , s + count ) не является допустимым диапазоном, поведение не определено.
7) Эквивалентно basic_string ( s, Traits :: length ( s ) , alloc ) .

Эта перегрузка участвует в разрешении перегрузки только если Allocator удовлетворяет требованиям Allocator .

(начиная с C++17)
8) std::basic_string не может быть сконструирован из nullptr .
9) Неявно преобразует t в строковое представление sv как если бы с помощью std:: basic_string_view < CharT, Traits > sv = t ; , затем конструирует строку как если бы с помощью basic_string ( sv. data ( ) , sv. size ( ) , alloc ) .
Эта перегрузка участвует в разрешении перегрузки только если std:: is_convertible_v < const StringViewLike & ,
std:: basic_string_view < CharT, Traits >>
равно true и std:: is_convertible_v < const StringViewLike & , const CharT * > равно false .
10) Неявно преобразует t в строковое представление sv как если бы std:: basic_string_view < CharT, Traits > sv = t ; , затем конструирует строку как если бы basic_string ( sv. substr ( pos, n ) , alloc ) .
Эта перегрузка участвует в разрешении перегрузки только если std:: is_convertible_v < const StringViewLike & ,
std:: basic_string_view < CharT, Traits >>
является true .
11-18) Создает строку с (частью) содержимого other . Если тип other является basic_string&& , по завершении конструирования other находится в допустимом, но неопределенном состоянии.
11) Конструктор копирования.

Аллокатор получается как если бы вызывался std:: allocator_traits < Allocator > ::
select_on_container_copy_construction
( other. get_allocator ( ) )
.

(since C++11)
12) Конструктор перемещения. Аллокатор получается путем перемещения из other. get_allocator ( ) .
13) То же, что и конструктор копирования, за исключением того, что alloc используется в качестве аллокатора.
Если CharT не является CopyInsertable в std:: basic_string < CharT > , поведение не определено.
14) То же, что и конструктор перемещения, за исключением того, что alloc используется в качестве аллокатора.
Если CharT не является MoveInsertable в std:: basic_string < CharT > , поведение не определено.
15,16) Создает строку с содержимым диапазона [ other. data ( ) + pos , other. data ( ) + other. size ( ) ) .
17,18) Создает строку с содержимым диапазона [ other. data ( ) + pos , other. data ( ) + ( pos + std:: min ( count, other. size ( ) - pos ) ) ) .
19) Эквивалентно basic_string ( ilist. begin ( ) , ilist. end ( ) ) .

Содержание

Параметры

alloc - аллокатор, используемый для всех выделений памяти этой строки
count - размер результирующей строки
ch - значение для инициализации строки
pos - позиция первого включаемого символа
first, last - диапазон для копирования символов
s - указатель на массив символов, используемый как источник для инициализации строки
other - другая строка, используемая как источник для инициализации строки
ilist - std::initializer_list для инициализации строки
t - объект (преобразуемый в std::basic_string_view ) для инициализации строки
rg - диапазон, совместимый с контейнером

Сложность

1,2) Константа.
3-7) Линейно относительно размера строки.
9-11) Линейно относительно размера строки.
12) Константа.
13) Линейно от размера строки.
14) Линейная относительно размера строки, если alloc ! = other. get_allocator ( ) равно true , в противном случае константная.
15-19) Линейно от размера строки.

Исключения

10) std::out_of_range если pos находится вне допустимого диапазона.
14) Ничего не выбрасывает, если alloc == str. get_allocator ( ) равно true .
15-18) std::out_of_range если pos > other. size ( ) равно true .

Выбрасывает std::length_error если длина создаваемой строки превысит max_size() (например, если count > max_size ( ) для (3) ). Вызовы Allocator::allocate могут выбрасывать исключения.

Если исключение выбрасывается по любой причине, эти функции не оказывают никакого эффекта ( strong exception safety guarantee ).

Примечания

Инициализация с помощью строкового литерала , содержащего встроенные символы ' \0 ' , использует перегрузку (7) , которая останавливается на первом нулевом символе. Этого можно избежать, указав другой конструктор или используя operator""s :

std::string s1 = "ab\0\0cd";   // s1 содержит "ab"
std::string s2{"ab\0\0cd", 6}; // s2 содержит "ab\0\0cd"
std::string s3 = "ab\0\0cd"s;  // s3 содержит "ab\0\0cd"
Feature-test macro Value Std Feature
__cpp_lib_containers_ranges 202202L (C++23) Помеченный конструктор (5) для создания из диапазона, совместимого с контейнером

Пример

#include <cassert>
#include <cctype>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <string>
int main()
{
    std::cout << "1)  string(); ";
    std::string s1;
    assert(s1.empty() && (s1.length() == 0) && (s1.size() == 0));
    std::cout << "s1.capacity(): " << s1.capacity() << '\n'; // не указано
    std::cout << "3)  string(size_type count, CharT ch): ";
    std::string s2(4, '=');
    std::cout << std::quoted(s2) << '\n'; // "===="
    std::cout << "4)  string(InputIt first, InputIt last): ";
    char mutable_c_str[] = "другая C-строка в стиле C";
    std::string s4(std::begin(mutable_c_str) + 8, std::end(mutable_c_str) - 1);
    std::cout << std::quoted
(Примечание: Согласно требованиям, HTML-теги и атрибуты не переведены, термин `std::quoted` как специфический для C++ оставлен без перевода)(s4) << '\n'; // "C-style string"
    std::cout << "6)  string(CharT const* s, size_type count): ";
    std::string s6("C-style string", 7);
    std::cout << std::quoted(s6) << '\n'; // "C-стиль", т.е. [0, 7)
    std::cout << "7)  string(CharT const* s): ";
    std::string s7("C-строка\0");
    std::cout << std::quoted
(Примечание: В соответствии с инструкциями, HTML-теги, атрибуты и C++ специфичные термины (включая `std::quoted`) не переведены. Весь переводимый текст отсутствует, кроме самого термина, который переводить не требуется.)(s7) << '\n'; // "C-style"
    std::cout << "11) string(string&): ";
    std::string const other11("Экземпляр");
    std::string s11(other11);
    std::cout << std::quoted
(Примечание: Согласно требованиям, HTML-теги и атрибуты не переведены, термин `std::quoted` как специфический для C++ оставлен без перевода)(s11) << '\n'; // "Экземпляр"
    std::cout << "12) string(string&&): ";
    std::string s12(std::string("C++ от ") + std::string("пример"));
    std::cout << std::quoted
(Примечание: Согласно требованиям, HTML-теги и атрибуты не переведены, термин `std::quoted` как специфический для C++ оставлен без перевода)(s12) << '\n'; // "C++ by example"
    std::cout << "15) string(const string& other, size_type pos): ";
    std::string const other15("Mutatis Mutandis");
    std::string s15(other15, 8);
    std::cout << std::quoted
(Примечание: Согласно требованиям, HTML-теги и атрибуты не переведены, термин `std::quoted` как специфический для C++ оставлен без перевода)(s15) << '\n'; // "Mutandis", т.е. [8, 16)
    std::cout << "17) string(const string& other, size_type pos, size_type count): ";
    std::string const other17("Примерный");
    std::string s17(other17, 0, other17.length() - 1);
    std::cout << std::quoted
(Примечание: Согласно требованиям, HTML-теги и атрибуты не переведены, термин `std::quoted` как специфичный для C++ сохранен без изменений. Так как весь текст внутри тегов является техническим термином, перевод не требуется)(s17) << '\n'; // "Экземпляр"
    std::cout << "19) string(std::initializer_list<CharT>): ";
    std::string s19({'C', '-', 's', 't', 'y', 'l', 'e'});
    std::cout << std::quoted(s19) << '\n'; // "C-style"
}

Возможный вывод:

1)  string(); s1.capacity(): 15
3)  string(size_type count, CharT ch): "===="
4)  string(InputIt first, InputIt last): "C-style string"
6)  string(CharT const* s, size_type count): "C-style"
7)  string(CharT const* s): "C-style"
11) string(string&): "Exemplar"
12) string(string&&): "C++ by example"
15) string(const string& other, size_type pos): "Mutandis"
17) string(const string& other, size_type pos, size_type count): "Exemplar"
19) string(std::initializer_list<CharT>): "C-style"

Отчеты о дефектах

Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применено к Поведение как опубликовано Корректное поведение
LWG 301 C++98 перегрузка (4) не использовала параметр
alloc если InputIt является целочисленным типом
использовать этот параметр
LWG 438 C++98 перегрузка (4) вызывала бы только перегрузку (3)
если InputIt является целочисленным типом
вызывает перегрузку (3) если InputIt
не является LegacyInputIterator
LWG 847 C++98 не было гарантии безопасности исключений добавлена строгая гарантия безопасности исключений
LWG 2193 C++11 конструктор по умолчанию является explicit сделан non-explicit
LWG 2235 C++98 s мог быть нулевым указателем поведение не определено в этом случае
LWG 2250 C++98 поведение перегрузки (17) было не определено
если pos > other. size ( ) равно true
всегда выбрасывает
исключение в этом случае
LWG 2583 C++98 не было способа предоставить аллокатор для перегрузки (17) добавлена перегрузка (15)
LWG 2946 C++17 перегрузка (9) вызывает неоднозначность в некоторых случаях избежано путём превращения в шаблон
LWG 3076 C++17 перегрузки (3,7) могут вызывать неоднозначности
при выводе аргументов шаблона класса
ограничены
LWG 3111
( P1148R0 )
C++98 решение LWG issue 2235 сделало
поведение basic_string ( nullptr, 0 ) неопределённым
поведение является хорошо-
определённым в этом случае [1]
  1. [ nullptr , nullptr + 0 ) является допустимым пустым диапазоном, поскольку добавление нуля к нулевому указателю также корректно определено (результат всё равно остаётся нулевым указателем).

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

присваивает символы строке
(публичная функция-член)
присваивает значения строке
(публичная функция-член)
(C++11)
преобразует целочисленное или вещественное значение в string
(функция)
(C++11)
преобразует целочисленное или вещественное значение в wstring
(функция)
создает basic_string_view
(публичная функция-член std::basic_string_view<CharT,Traits> )