Cargando...

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:

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

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?


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