std::basic_string
| Definido en el encabezado <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) | (desde C++17) |
La plantilla de clase basic_string almacena y manipula secuencias de objetos tipo carácter, que son objetos que no son arreglos de TrivialType y StandardLayoutType. La clase no depende ni del tipo de carácter ni de la naturaleza de las operaciones sobre ese tipo. Las definiciones de las operaciones se proporcionan a través del parámetro de plantilla Traits: una especialización de std::char_traits o una clase de rasgos compatible.
Los elementos de un basic_string se almacenan de forma contigua, es decir, para un basic_string s, &*(s.begin() + n) == &*s.begin() + n para cualquier n en [0, s.size()), y *(s.begin() + s.size()) tiene el valor CharT() (un terminador nulo)(desde C++11); o, de manera equivalente, un puntero a s[0] se puede pasar a funciones que esperan un puntero al primer elemento de un arreglo(hasta C++11)un arreglo terminado en nulo(desde C++11) de CharT.
std::basic_string satisface los requisitos de AllocatorAwareContainer (excepto que las construct/destroy personalizadas no se utilizan para la construcción/destrucción de elementos), SequenceContainer y ContiguousContainer(desde C++17).
Si alguno de Traits::char_type y Allocator::char_type es diferente de CharT, el programa está mal formado.
|
Todas las funciones miembro de
Sin embargo, definir una variable |
(desde C++20) |
Se proporcionan varias definiciones de tipos (typedefs) para tipos de caracteres comunes:
Definido en el encabezado
<string> | |
| Tipo | Definición |
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>
|
Parámetros de plantilla
| CharT | - | tipo de carácter |
| Traits | - | clase de rasgos que especifica las operaciones sobre el tipo de carácter |
| Allocator | - | Allocator tipo utilizado para asignar almacenamiento interno |
Tipos anidados
| Tipo | Definición | ||||
traits_type
|
Traits
|
||||
value_type
|
CharT
|
||||
allocator_type
|
Allocator
|
||||
size_type
|
|
||||
difference_type
|
|
||||
reference
|
value_type & | ||||
const_reference
|
const value_type & | ||||
pointer
|
|
||||
const_pointer
|
|
||||
iterator
|
|
||||
const_iterator
|
|
||||
reverse_iterator
|
std:: reverse_iterator < iterator > | ||||
const_reverse_iterator
|
std:: reverse_iterator < const_iterator > |
Miembros de datos
constexpr
size_type
npos
[static]
|
el valor especial size_type ( - 1 ) , su significado exacto depende del contexto |
Funciones miembro
construye un
basic_string
(función miembro pública) |
|
|
destruye la cadena, desasignando el almacenamiento interno si se utilizó
(función miembro pública) |
|
|
asigna valores a la cadena
(función miembro pública) |
|
|
asignar caracteres a una cadena
(función miembro pública) |
|
|
(C++23)
|
asignar un rango de caracteres a una cadena
(función miembro pública) |
|
devuelve el asignador asociado
(función miembro pública) |
|
Acceso a elementos |
|
|
accede al carácter especificado con verificación de límites
(función miembro pública) |
|
|
accede al carácter especificado
(función miembro pública) |
|
|
(
DR*
)
|
accede al primer carácter
(función miembro pública) |
|
(
DR*
)
|
accede al último carácter
(función miembro pública) |
|
devuelve un puntero al primer carácter de una cadena
(función miembro pública) |
|
|
devuelve una versión no modificable del arreglo de caracteres estándar de C de la cadena
(función miembro pública) |
|
|
(C++17)
|
devuelve un
basic_string_view
no modificable de toda la cadena
(función miembro pública) |
Iteradores |
|
|
(C++11)
|
devuelve un iterador al inicio
(función miembro pública) |
|
(C++11)
|
devuelve un iterador al final
(función miembro pública) |
|
(C++11)
|
devuelve un iterador inverso al principio
(función miembro pública) |
|
(C++11)
|
devuelve un iterador inverso al final
(función miembro pública) |
Capacidad |
|
|
comprueba si la cadena está vacía
(función miembro pública) |
|
|
devuelve el número de caracteres
(función miembro pública) |
|
|
devuelve el número máximo de caracteres
(función miembro pública) |
|
|
reserva almacenamiento
(función miembro pública) |
|
|
devuelve el número de caracteres que pueden almacenarse en el almacenamiento actualmente asignado
(función miembro pública) |
|
|
(
DR*
)
|
reduce el uso de memoria liberando memoria no utilizada
(función miembro pública) |
Modificadores |
|
|
borra el contenido
(función miembro pública) |
|
|
inserta caracteres
(función miembro pública) |
|
|
(C++23)
|
inserta un rango de caracteres
(función miembro pública) |
|
elimina caracteres
(función miembro pública) |
|
|
añade un carácter al final
(función miembro pública) |
|
|
(
DR*
)
|
elimina el último carácter
(función miembro pública) |
|
añade caracteres al final
(función miembro pública) |
|
|
(C++23)
|
agrega un rango de caracteres al final
(función miembro pública) |
|
añade caracteres al final
(función miembro pública) |
|
|
reemplaza la porción especificada de una cadena
(función miembro pública) |
|
|
(C++23)
|
reemplaza una porción específica de una cadena con un rango de caracteres
(función miembro pública) |
|
copia caracteres
(función miembro pública) |
|
|
cambia el número de caracteres almacenados
(función miembro pública) |
|
|
(C++23)
|
cambia el número de caracteres almacenados y posiblemente sobrescribe contenidos indeterminados mediante una operación proporcionada por el usuario
(función miembro pública) |
|
intercambia los contenidos
(función miembro pública) |
|
Búsqueda |
|
|
encuentra la primera ocurrencia de la subcadena dada
(función miembro pública) |
|
|
encontrar la última ocurrencia de una subcadena
(función miembro pública) |
|
|
encontrar primera ocurrencia de caracteres
(función miembro pública) |
|
|
encontrar primera ausencia de caracteres
(función miembro pública) |
|
|
encontrar última ocurrencia de caracteres
(función miembro pública) |
|
|
encontrar última ausencia de caracteres
(función miembro pública) |
|
Operaciones | |
| compara dos cadenas (función miembro pública) | |
(C++20) |
comprueba si la cadena comienza con el prefijo dado (función miembro pública) |
(C++20) |
comprueba si la cadena termina con el sufijo dado (función miembro pública) |
(C++23) |
comprueba si la cadena contiene la subcadena o el carácter dado (función miembro pública) |
| devuelve una subcadena (función miembro pública) | |
(C++26) |
devuelve una subvista (función miembro pública) |
Funciones no miembro
|
concatena dos cadenas, una cadena y un
char
, o una cadena y
string_view
(plantilla de función) |
|
|
(eliminado en C++20)
(eliminado en C++20)
(eliminado en C++20)
(eliminado en C++20)
(eliminado en C++20)
(C++20)
|
compara lexicográficamente dos cadenas
(plantilla de función) |
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
|
elimina todos los elementos que cumplen criterios específicos
(plantilla de función) |
|
Entrada/Salida |
|
|
realiza entrada y salida de flujo en cadenas
(plantilla de función) |
|
|
lee datos de un flujo de E/S hacia una cadena
(plantilla de función) |
|
Conversiones numéricas |
|
|
(C++11)
(C++11)
(C++11)
|
convierte una cadena a un entero con signo
(función) |
|
(C++11)
(C++11)
|
convierte una cadena a un entero sin signo
(función) |
|
(C++11)
(C++11)
(C++11)
|
convierte una cadena a un valor de punto flotante
(función) |
|
(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) |
Literales
|
Definido en el espacio de nombres en línea
std::literals::string_literals
|
|
|
(C++14)
|
convierte un literal de arreglo de caracteres a
basic_string
(función) |
Clases auxiliares
|
(C++11)
|
soporte de hash para cadenas
(especialización de plantilla de clase) |
Guías de deducción (desde C++17)
Invalidación de iteradores
Las referencias, punteros e iteradores que hacen referencia a los elementos de un
basic_string
pueden ser invalidados por cualquier función de la biblioteca estándar que tome una referencia a un
basic_string
no constante como argumento, como
std::getline
,
std::swap
, o
operator>>
, y al llamar a funciones miembro no constantes, excepto
operator[]
,
at
,
data
,
front
,
back
,
begin
,
rbegin
,
end
, y
rend
.
Notas
Aunque se requería que se utilizaran
construct
o
destroy
personalizados al construir o destruir elementos de
std::basic_string
hasta C++23, todas las implementaciones solo utilizaron el mecanismo predeterminado. El requisito se corrigió mediante
P1072R10
para ajustarse a la práctica existente.
| Macro de prueba de características | Valor | Estándar | Característica |
|---|---|---|---|
__cpp_lib_string_udls
|
201304L
|
(C++14) | Literales definidos por el usuario para tipos de cadena |
__cpp_lib_starts_ends_with
|
201711L
|
(C++20) |
starts_with
,
ends_with
|
__cpp_lib_constexpr_string
|
201907L
|
(C++20) |
Constexpr para
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) | Funciones miembro para construcción, inserción y reemplazo que aceptan rango compatible con contenedor |
Ejemplo
#include <iostream> #include <string> int main() { using namespace std::literals; // Creando un string desde const char* std::string str1 = "hello"; // Creando un string usando literal de cadena auto str2 = "world"s; // Concatenando strings std::string str3 = str1 + " " + str2; // Imprimir el resultado std::cout << str3 << '\n'; std::string::size_type pos = str3.find(" "); str1 = str3.substr(pos + 1); // la parte después del espacio str2 = str3.substr(0, pos); // la parte hasta el espacio std::cout << str1 << ' ' << str2 << '\n'; // Accediendo a un elemento usando el operador subíndice[] std::cout << str1[0] << '\n'; str1[0] = 'W'; std::cout << str1 << '\n'; }
Salida:
hello world world hello w World
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Se aplica a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 530 | C++98 |
la contigüidad del almacenamiento para elementos de
basic_string
se eliminó accidentalmente por LWG259 |
se requiere nuevamente |
| LWG 2861 | C++98 |
value_type
era
Traits::char_type
|
cambiado a
CharT
|
|
LWG 2994
( P1148R0 ) |
C++98 |
el comportamiento es indefinido si alguno de
Traits::char_type
[1]
y
Allocator::char_type
es diferente de
CharT
|
el programa es
incorrecto en este caso |
Véase también
|
(C++17)
|
vista de cadena de solo lectura
(plantilla de clase) |
Enlaces externos
| Manejo de cadenas en C++ |