Manejo ligero de cadenas con std::string_view en C++
Aprende std::string_view en C++ para realizar operaciones eficientes sobre cadenas sin copias innecesarias.
Introducido en C++17, std::string_view es una abstracción ligera y de alto rendimiento
que permite trabajar con texto sin copiarlo.
Comparado con std::string, string_view es mucho más rápido porque no posee los datos:
simplemente proporciona una vista (view) sobre una zona de memoria existente.
Este artículo explica las ventajas de string_view, sus casos de uso y las precauciones importantes.
1) ¿Qué es string_view?
std::string_view representa una cadena (o parte de ella) sin copiar sus datos. Internamente, almacena:
- Un puntero al comienzo del texto
- La longitud del texto
Es decir: string_view no posee la cadena; solo la referencia.
#include <string_view>
#include <iostream>
using namespace std;
int main() {
string text = "Hola Mundo";
string_view sv = text;
cout << sv << endl;
}
2) Ventajas de rendimiento de string_view
std::string → copia datos
Copiar puede ser costoso, especialmente con textos grandes.
std::string_view → NO copia datos
Solo almacena un puntero y una longitud. Esto lo convierte en una herramienta extremadamente rápida, ideal para parsing, análisis de logs, lectura de configuraciones, etc.
3) Subcadenas con string_view
string_view sv = "Lenguaje de Programación C++";
auto first = sv.substr(0, 3); // "Len"
auto second = sv.substr(10, 13); // "Programación"
cout << first << " | " << second;
4) Eliminar espacios (función trim)
string_view trim(string_view sv) {
while (!sv.empty() && isspace(sv.front()))
sv.remove_prefix(1);
while (!sv.empty() && isspace(sv.back()))
sv.remove_suffix(1);
return sv;
}
int main() {
string_view text = " Hola ";
string_view cleaned = trim(text);
cout << "[" << cleaned << "]";
}
Salida: [Hola]
5) Dividir cadenas (split) con string_view
#include <vector>
vector<string_view> split(string_view sv, char delimiter) {
vector<string_view> parts;
size_t start = 0;
while (true) {
size_t pos = sv.find(delimiter, start);
if (pos == string_view::npos) {
parts.push_back(sv.substr(start));
break;
}
parts.push_back(sv.substr(start, pos - start));
start = pos + 1;
}
return parts;
}
int main() {
string_view text = "cpp,java,python";
auto parts = split(text, ',');
for (auto p : parts)
cout << p << endl;
}
6) Precauciones importantes al usar string_view
- Advertencia: string_view NO posee los datos.
- Por lo tanto: si la cadena original desaparece, el string_view queda inválido.
Ejemplo peligroso
string_view danger() {
string temp = "Hola"; // se destruye al final de la función
return temp; // ¡PELIGROSO!
}
Resultado: comportamiento indefinido.
Ejemplo correcto
string globalText = "Seguro";
string_view sv = globalText; // seguro
7) Comparación de string_view
string_view a = "cpp";
string_view b = "cpp";
if (a == b)
cout << "Iguales";
string_view permite comparar directamente el contenido.
8) Ejemplo práctico — Análisis de comandos
void parseCommand(string_view cmd) {
if (cmd.starts_with("add"))
cout << "Comando agregar";
else if (cmd.starts_with("delete"))
cout << "Comando eliminar";
}
int main() {
parseCommand("add user");
}
9) ¿Cuándo deberías usar string_view?
- Cuando trabajas con grandes cantidades de texto
- Para obtener subcadenas de forma eficiente
- Para evitar asignaciones de memoria innecesarias
- Para parsing de alto rendimiento
10) TL;DR
- string_view: tipo de cadena ligero que no posee los datos.
- Muy rápido para operaciones de subcadenas.
- Requiere que la cadena original siga siendo válida.
- Ideal para parsing, análisis de logs y lectura de configuraciones.
- Ejemplos compatibles con Visual Studio 2022 y GCC.
Artículos relacionados
Introducción a las funciones en C++: definir, llamar, parámetros
Aprende funciones en C++, incluyendo definición, llamadas y parámetros para crear programas reutilizables.
Manejo de cadenas en C++: estilo C y std::string
Aprende manejo de cadenas en C++ usando cadenas estilo C y std::string con ejemplos prácticos.
Visión general de la biblioteca estándar de C++
Aprende la biblioteca estándar de C++, incluyendo contenedores STL, algoritmos y componentes esenciales del desarrollo moderno.