Namespaces
Variants

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

From cppreference.net
std::basic_string
(1)
basic_string ( ) : basic_string ( Allocator ( ) ) { }
(desde C++11)
(hasta C++17)
basic_string ( ) noexcept ( noexcept ( Allocator ( ) ) )
: basic_string ( Allocator ( ) ) { }
(desde C++17)
(constexpr desde C++20)
(2)
explicit basic_string ( const Allocator & alloc = Allocator ( ) ) ;
(hasta C++11)
explicit basic_string ( const Allocator & alloc ) ;
(noexcept desde C++17)
(constexpr desde C++20)
basic_string ( size_type count, CharT ch,
const Allocator & alloc = Allocator ( ) ) ;
(3) (constexpr desde C++20)
template < class InputIt >

basic_string ( InputIt first, InputIt last,

const Allocator & alloc = Allocator ( ) ) ;
(4) (constexpr desde C++20)
template < container-compatible-range < CharT > R >

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

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

explicit basic_string ( const StringViewLike & t,

const Allocator & alloc = Allocator ( ) ) ;
(9) (desde C++17)
(constexpr desde C++20)
template < class StringViewLike >

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

const Allocator & alloc = Allocator ( ) ) ;
(10) (desde C++17)
basic_string ( const basic_string & other ) ;
(11) (constexpr desde C++20)
basic_string ( basic_string && other ) noexcept ;
(12) (desde C++11)
(constexpr desde C++20)
basic_string ( const basic_string & other, const Allocator & alloc ) ;
(13) (desde C++11)
(constexpr desde C++20)
basic_string ( basic_string && other, const Allocator & alloc ) ;
(14) (desde C++11)
(constexpr desde C++20)
basic_string ( const basic_string & other, size_type pos,
const Allocator & alloc = Allocator ( ) ) ;
(15) (constexpr desde C++20)
constexpr basic_string ( basic_string && other, size_type pos,
const Allocator & alloc = Allocator ( ) ) ;
(16) (desde C++23)
basic_string ( const basic_string & other,

size_type pos, size_type count,

const Allocator & alloc = Allocator ( ) ) ;
(17) (constexpr desde C++20)
constexpr basic_string ( basic_string && other,

size_type pos, size_type count,

const Allocator & alloc = Allocator ( ) ) ;
(18) (desde C++23)
basic_string ( std:: initializer_list < CharT > ilist,
const Allocator & alloc = Allocator ( ) ) ;
(19) (desde C++11)
(constexpr desde C++20)

Construye una nueva cadena a partir de diversas fuentes de datos y opcionalmente utilizando el asignador suministrado por el usuario alloc .

1) El constructor predeterminado desde C++11. Construye una cadena vacía con un asignador construido por defecto.
Si Allocator no es DefaultConstructible , el comportamiento es indefinido.
2) El constructor predeterminado hasta C++11. Construye una cadena vacía con el asignador dado alloc .
3) Construye una cadena con count copias del carácter ch .

Si CharT no es CopyInsertable en std:: basic_string < CharT > , el comportamiento es indefinido.

(desde C++11)

Esta sobrecarga participa en la resolución de sobrecarga solo si Allocator cumple con los requisitos de Allocator .

(desde C++17)
4) Construye una cadena con los contenidos del rango [ first , last ) . Cada iterador en [ first , last ) es desreferenciado exactamente una vez.

Si InputIt no satisface los requisitos de LegacyInputIterator , la sobrecarga (3) es llamada en su lugar con los argumentos static_cast < size_type > ( first ) , last y alloc .

(hasta C++11)

Esta sobrecarga participa en la resolución de sobrecarga solo si InputIt satisface los requisitos de LegacyInputIterator .

Si CharT no es EmplaceConstructible en std:: basic_string < CharT > desde * first , el comportamiento es indefinido.

(desde C++11)
5) Construye una cadena con el contenido del rango rg . Cada iterador en rg se desreferencia exactamente una vez.
Si CharT no es EmplaceConstructible en std:: basic_string < CharT > desde * ranges:: begin ( rg ) , el comportamiento es indefinido.
6) Construye una cadena con el contenido del rango [ s , s + count ) .
Si [ s , s + count ) no es un rango válido, el comportamiento es indefinido.
7) Equivalente a basic_string ( s, Traits :: length ( s ) , alloc ) .

Esta sobrecarga participa en la resolución de sobrecarga solo si Allocator cumple con los requisitos de Allocator .

(desde C++17)
8) std::basic_string no puede ser construido desde nullptr .
9) Convierte implícitamente t a una string view sv como si fuera mediante std:: basic_string_view < CharT, Traits > sv = t ; , luego construye un string como si fuera mediante basic_string ( sv. data ( ) , sv. size ( ) , alloc ) .
Esta sobrecarga participa en la resolución de sobrecarga solo si std:: is_convertible_v < const StringViewLike & ,
std:: basic_string_view < CharT, Traits >>
es true y std:: is_convertible_v < const StringViewLike & , const CharT * > es false .
10) Convierte implícitamente t a una string view sv como si fuera mediante std:: basic_string_view < CharT, Traits > sv = t ; , luego construye un string como si fuera mediante basic_string ( sv. substr ( pos, n ) , alloc ) .
Esta sobrecarga participa en la resolución de sobrecarga solo si std:: is_convertible_v < const StringViewLike & ,
std:: basic_string_view < CharT, Traits >>
es true .
11-18) Construye una cadena con (parte de) el contenido de other . Si el tipo de other es basic_string&& , cuando la construcción finaliza, other queda en un estado válido pero no especificado.
11) El constructor de copia.

El asignador se obtiene como si se llamara a std:: allocator_traits < Allocator > ::
select_on_container_copy_construction
( other. get_allocator ( ) )
.

(desde C++11)
12) El constructor de movimiento. El asignador se obtiene mediante construcción por movimiento de other. get_allocator ( ) .
13) Igual que el constructor de copia, excepto que alloc se utiliza como el asignador.
Si CharT no es CopyInsertable en std:: basic_string < CharT > , el comportamiento es indefinido.
14) Igual que el constructor de movimiento, excepto que alloc se utiliza como el asignador.
Si CharT no es MoveInsertable en std:: basic_string < CharT > , el comportamiento es indefinido.
15,16) Construye una cadena con el contenido del rango [ other. data ( ) + pos , other. data ( ) + other. size ( ) ) .
17,18) Construye una cadena con el contenido del rango [ other. data ( ) + pos , other. data ( ) + ( pos + std:: min ( count, other. size ( ) - pos ) ) ) .
19) Equivalente a basic_string ( ilist. begin ( ) , ilist. end ( ) ) .

Contenidos

Parámetros

alloc - asignador a utilizar para todas las asignaciones de memoria de esta cadena
count - tamaño de la cadena resultante
ch - valor con el que inicializar la cadena
pos - posición del primer carácter a incluir
first, last - rango desde el cual copiar los caracteres
s - puntero a un arreglo de caracteres a utilizar como fuente para inicializar la cadena
other - otra cadena a utilizar como fuente para inicializar la cadena
ilist - std::initializer_list para inicializar la cadena
t - objeto (convertible a std::basic_string_view ) para inicializar la cadena
rg - un rango compatible con contenedor

Complejidad

1,2) Constante.
3-7) Lineal en el tamaño de la cadena.
9-11) Lineal en el tamaño de la cadena.
12) Constante.
13) Lineal en el tamaño de la cadena.
14) Lineal en el tamaño de la cadena si alloc ! = other. get_allocator ( ) es true , de lo contrario constante.
15-19) Lineal en el tamaño de la cadena.

Excepciones

10) std::out_of_range si pos está fuera de rango.
14) No lanza nada si alloc == str. get_allocator ( ) es true .
15-18) std::out_of_range si pos > other. size ( ) es true .

Lanza std::length_error si la longitud de la cadena construida excediera max_size() (por ejemplo, si count > max_size ( ) para (3) ). Las llamadas a Allocator::allocate pueden lanzar excepciones.

Si se lanza una excepción por cualquier motivo, estas funciones no tienen efecto ( strong exception safety guarantee ).

Notas

Inicialización con un string literal que contiene caracteres ' \0 ' incrustados utiliza la sobrecarga (7) , que se detiene en el primer carácter nulo. Esto puede evitarse especificando un constructor diferente o utilizando operator""s :

std::string s1 = "ab\0\0cd";   // s1 contiene "ab"
std::string s2{"ab\0\0cd", 6}; // s2 contiene "ab\0\0cd"
std::string s3 = "ab\0\0cd"s;  // s3 contiene "ab\0\0cd"
Macro de prueba de características Valor Std Característica
__cpp_lib_containers_ranges 202202L (C++23) Constructor etiquetado (5) para construir desde rango compatible con contenedor

Ejemplo

#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'; // no especificado
    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[] = "otra cadena de estilo C";
    std::string s4(std::begin(mutable_c_str) + 8, std::end(mutable_c_str) - 1);
    std::cout << std::quoted(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'; // "Estilo C", es decir, [0, 7)
    std::cout << "7)  string(CharT const* s): ";
    std::string s7("Cadena al estilo C\0");
    std::cout << std::quoted(s7) << '\n'; // "C-style"
    std::cout << "11) string(string&): ";
    std::string const other11("Ejemplar");
    std::string s11(other11);
    std::cout << std::quoted(s11) << '\n'; // "Exemplar"
    std::cout << "12) string(string&&): ";
    std::string s12(std::string("C++ por ") + std::string("ejemplo"));
    std::cout << std::quoted(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(s15) << '\n'; // "Mutandis", es decir, [8, 16)
    std::cout << "17) string(const string& other, size_type pos, size_type count): ";
    std::string const other17("Ejemplar");
    std::string s17(other17, 0, other17.length() - 1);
    std::cout << std::quoted(s17) << '\n'; // "Exemplar"
    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"
}

Salida posible:

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"

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 301 C++98 la sobrecarga (4) no utilizaba el parámetro
alloc si InputIt es un tipo integral
utiliza ese parámetro
LWG 438 C++98 la sobrecarga (4) solo llamaría a la sobrecarga (3)
si InputIt es un tipo integral
llama a la sobrecarga (3) si InputIt
no es un LegacyInputIterator
LWG 847 C++98 no existía garantía de seguridad de excepciones se añadió garantía fuerte de seguridad de excepciones
LWG 2193 C++11 el constructor por defecto es explícito se hizo no explícito
LWG 2235 C++98 s podría ser un valor de puntero nulo el comportamiento es indefinido en este caso
LWG 2250 C++98 el comportamiento de la sobrecarga (17) era indefinido
si pos > other. size ( ) es true
siempre lanza una
excepción en este caso
LWG 2583 C++98 no había forma de proporcionar un asignador para la sobrecarga (17) se añadió la sobrecarga (15)
LWG 2946 C++17 la sobrecarga (9) causa ambigüedad en algunos casos se evita haciéndola una plantilla
LWG 3076 C++17 las sobrecargas (3,7) podrían causar ambigüedades
en la deducción de argumentos de plantilla de clase
se restringieron
LWG 3111
( P1148R0 )
C++98 la resolución de LWG issue 2235 hizo que el
comportamiento de basic_string ( nullptr, 0 ) fuera indefinido
el comportamiento está bien
definido en este caso [1]
  1. [ nullptr , nullptr + 0 ) es un rango vacío válido, porque sumar cero a un valor de puntero nulo también está bien definido (el resultado sigue siendo un valor de puntero nulo).

Véase también

asignar caracteres a una cadena
(función miembro pública)
asigna valores a la cadena
(función miembro pública)
(C++11)
convierte un valor entero o de punto flotante a string
(función)
(C++11)
convierte un valor entero o de punto flotante a wstring
(función)
construye un basic_string_view
(función miembro pública de std::basic_string_view<CharT,Traits> )