C++ StringStreams

Fernando Briano, de Picando Código, está con un artículo muy interesante hoy sobre StringBuilders y StringBuffers de Java. El artículo describe el por qué un desarrollador querría hacer uso de éstos en vez de los operadores sobrecargados de String (como “+”) para concatenar Strings.

La clase string de C++, definida dentro del cabezal <string> y bajo el namespace std, también provee un operador sobrecargado de “+” para concatenar instancias de strings pero, al igual que en Java, existen circunstancias en las cuales es mejor utilizar un buffer para concatenar, por ejemplo, para evitar crear muchos objetos temporales en el stack (nótese que a diferencia de Java, en C++ podemos crear objetos tanto en el Stack como en el Heap.).

La clase stringstream, también del namespace std pero definida en el cabezal <sstream> provee una funcionalidad similar al StringBuilder de Java, pero haciendo uso del operador de inserción de flujos de C++ (<<). Los stringstreams permiten insertar cualquier tipo de dato dentro del flujo. Todos serán convertidos automáticamente a strings y concatenados.

A continuación un ejemplo:

#include <iostream>
using std::cout;
using std::endl;

#include <sstream>
using std::stringstream;

int main(int argv, char* argv[])
{
    // Creamos un stringstream y concatenamos varias constantes:
    stringstream ss;
    ss << "Picando" << " " << "Codigo" << "; btw PI = " << 3.14159;

    // Imprimimos el string en la salida estándar:
   cout << ss.str() << endl;

   return 0;
}

A diferencia de Java, los stringstreams también pueden utilizarse para tokenizar strings. En este caso seteamos el string directamente y luego utilizamos el operador de extracción de flujo (>>) para obtener los tokens:

#include <sstream>
using std::stringstream;

int main(int argc, char* argv[])
{
    stringstream ss;
    ss.str("Tokenizame 2 4.0");

    string s;
    int i;
    double d;

    // Extrae, convierte a los tipos apropiados y asigna, todo en una sola línea:
    ss >> s >> i >> d;
    return 0;
}

Interesante, ¿no? Gran parte de la flexibilidad de los stringstreams viene de la posibilidad de C++ de sobrecargar operadores, lo cual permite simplificar la lectura de las rutinas que trabajan con entrada salida de flujos, ya sea E/S a la terminal o E/S a un buffer de strings.

This entry was posted in C++, Programacion. Bookmark the permalink.