C++17 presentó una nueva herramienta para el manejo de cadenas: std::string_view. Este tipo proporciona una vista ligera y no poseeodra sobre datos de cadena, permitiendo operaciones eficientes sin copiar el contenido subyacente. A continuación se detallan sus características clave, usos comunes y diferencias con std::string. ### Características fundamentales
- No posee memoria:
std::string_viewno administra la memoria del texto al que apunta. Solo mantiene un puntero y una longitud. El usuario debe garantizar que los datos originales permanezcan válidos durante todo el tiempo que se utilice la vista. - Ligereza en tamaño: La estructura ocupa solo dos campos (puntero + tamaño), lo que lo hace ideal como parámetro de función o retorno, evitando copias innecesarias.
- No requiere terminación nula: A diferencia de los strings tradicionales, no asume que el contenido esté finalizado con
'\0'. Esto permite representar datos bianrios o fragmentos arbitrarios. - Solo lectura: No se puede modificar el contenido original a través de la vista. Esta característica asegura consistencia y seguridad en operaciones de lectura.
- Compatibilidad con iteradores: Soporta interfaces de iteradores estándar, por lo que puede usarse directamente con algoritmos de la biblioteca STL.
Operaciones comunes
Se pueden crear instancias de std::string_view desde múltiples fuentes:
std::string base = "Hola, C++";
std::string_view view1(base); // Desde std::string
const char* raw = "Bienvenido";
std::string_view view2(raw); // Desde const char*
char buffer[] = "Texto temporal";
std::string_view view3(buffer, 8); // Desde arreglo con tamaño explícito
Para extraer subcadenas sin copiar:
std::string_view full = "Programación moderna";
std::string_view part = full.substr(0, 10); // "Programación"
Acceso individual y comparación:
char first = part[0]; // 'P'
if (part == "Programación") { // Comparación directa
std::cout << "Coincidencia encontrada\n";
}
Obtención de longitud:
std::size_t len = part.length(); // 10
Comparación entre std::string_view y std::string
| Criterio | std::string_view | std::string |
|---|---|---|
| Propiedad de datos | No posee | Sí posee |
| Copia de datos | Nunca | Siempre al construir/copiar |
| Uso recomendado | Funciones de lectura, parámetros, vistas temporales | Manipulación, edición, almacenamiento prolongado |
| Memoria dinámica | No usa | Usa si es necesario |
Consideraciones importantes
- La duración del objeto original debe superar la del
string_view. - No se puede modificar el contenido a través de la vista.
- No es adecuado para almacenar cadenas que deben persistir más allá del ámbito del origen.
Ejemplo práctico
#include <iostream>
#include <string_view>
void mostrarVista(std::string_view texto) {
std::cout << "Contenido: " << texto << '\n';
std::cout << "Longitud: " << texto.size() << '\n';
}
int main() {
std::string origen = "C++17: Vista ligera";
std::string_view vista(origen);
mostrarVista(vista);
auto subcadena = vista.substr(6); // "Vista ligera"
mostrarVista(subcadena);
return 0;
}
Este ejemplo demuestra cómo std::string_view permite trabajar con cadenas sin copiar datos, mejorando el rendimiento en funciones que solo leen contenido.