Namespaces
Variants

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

De es.cppreference.net
 
 
 
std::basic_string
 
basic_string() : basic_string(Allocator()) {}
(1) (desde C++11)
(hasta C++17)
basic_string() noexcept(noexcept(Allocator()))
    : basic_string(Allocator()) {}
(desde C++17)
(constexpr desde C++20)
explicit basic_string( const Allocator& alloc = Allocator() );
(2) (hasta C++11)
explicit basic_string( const Allocator& alloc );
(desde C++11)
(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 una variedad de fuentes de datos y usando opcionalmente un asignador proporcionado por el usuario alloc.

1) El constructor por defecto desde C++11. Construye una cadena vacía con un asignador construido por defecto.
Si Allocator no es DefaultConstructible, el comportamiento no está definido.
2) El constructor por defecto 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 no está definido.

(desde C++11)

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

(desde C++17)
4) Construye una cadena con el contenido 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 no está definido.

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

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

(desde C++17)
8) std::basic_string no puede ser construido desde nullptr.
9) Convierte implícitamente t a una vista de cadena sv como si fuera por std::basic_string_view<CharT, Traits> sv = t;, luego construye una cadena como si fuera por 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 vista de cadena sv como si fuera por std::basic_string_view<CharT, Traits> sv = t;, luego construye una cadena como si fuera por 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 termina, other está 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 de movimiento desde other.get_allocator().
13) Igual que el constructor de copia, excepto que alloc se usa como el asignador.
Si CharT no es CopyInsertable en std::basic_string<CharT>, el comportamiento no está definido.
14) Igual que el constructor de movimiento, excepto que alloc se usa como el asignador.
Si CharT no es MoveInsertable en std::basic_string<CharT>, el comportamiento no está definido.
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()).

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