¿Cuál es la diferencia entre istringstream, ostringstream y stringstream?/ ¿Por qué no utilizar stringstream en todos los casos?

StackOverflow https://stackoverflow.com/questions/3292107

Pregunta

¿Cuándo usaría? std::istringstream, std::ostringstream y std::stringstream y ¿por qué no debería simplemente usar std::stringstream en cada escenario (¿hay algún problema de rendimiento en tiempo de ejecución?).

Por último, ¿hay algo malo en esto (en lugar de utilizar una transmisión):

std::string stHehe("Hello ");

stHehe += "stackoverflow.com";
stHehe += "!";
¿Fue útil?

Solución

Personalmente, me parece muy raro que quiera realizar una transmisión en y salir de la misma corriente de cuerdas.

Por lo general, quiero inicializar una corriente de una cadena y luego analizarla;o transmita cosas a una corriente de cadena y luego extraiga el resultado y lo guarde.

Si está transmitiendo hacia y desde la misma corriente, debe tener mucho cuidado con las posiciones del estado de la transmisión y la corriente.

Uso 'solo' istringstream o ostringstream mejor expresa su intención y le brinda algunas comprobaciones contra errores tontos, como el uso accidental de << vs >>.

allí podría ser una mejora de rendimiento, pero no estaría mirando eso primero.

No hay nada de malo en lo que ha escrito.Si lo encuentras, no funciona lo suficientemente bien, entonces podría perfilar otros enfoques, de lo contrario, quédate con lo que es más claro.Personalmente, solo me gustaría:

std::string stHehe( "Hello stackoverflow.com!" );

Otros consejos

A stringstream es algo más grande y puede tener un rendimiento ligeramente inferior: la herencia múltiple puede requerir un ajuste en el puntero de vtable.La principal diferencia es (al menos en teoría) expresar mejor su intención y evitar que use accidentalmente >> donde pretendías << (o viceversa).OTOH, la diferencia es lo suficientemente pequeña como para que, especialmente para fragmentos rápidos de código de demostración y demás, soy vago y solo uso stringstream.No recuerdo bien la última vez que usé accidentalmente << cuando tenía la intención >>, así que para mí ese poco de seguridad parece más bien teórico (especialmente porque si hacer comete tal error, casi siempre será en realidad obvio casi de inmediato).

No hay nada de malo en usar simplemente una cuerda, siempre y cuando consiga lo que deseas.Si simplemente estás juntando hilos, es fácil y funciona bien.Sin embargo, si desea formatear otros tipos de datos, un stringstream admitirá eso, y una cadena en su mayoría no lo hará.

En la mayoría de los casos, no necesitará tanto entrada como salida en el mismo flujo de cadena, por lo que usar std::ostringstream y std::istringstream deja explícitamente clara su intención.También evita que escriba accidentalmente el operador incorrecto (<< vs >>).

Cuando necesite realizar ambas operaciones en la misma secuencia, obviamente usará la versión de propósito general.

Los problemas de rendimiento serían la menor de sus preocupaciones aquí, la claridad es la principal ventaja.

Finalmente, no hay nada de malo en usar string append ya que hay que construir cadenas puras.Simplemente no puedes usar eso para combinar números como puedes hacerlo en lenguajes como Perl.

istringstream es para la entrada, OstringStream para la salida.StringStream es entrada y salida. Puedes usar Stradstream casi en todas partes. Sin embargo, si le da su objeto a otro usuario, y utiliza el operador >>, mientras que, donde está esperando un objeto de escritura solo, no será feliz; -)

PS: nada malo al respecto, solo problemas de rendimiento.

Para responder a su tercera pregunta:No, eso es perfectamente razonable.La ventaja de usar secuencias es que puedes ingresar cualquier tipo de valor que tenga un operator<< definido, mientras que solo puede agregar cadenas (ya sea C++ o C) a un std::string.

Presumiblemente cuando solo la inserción o solo la extracción es apropiada para su operación, puede usar una de las versiones prefijadas 'I' o 'O' para excluir la operación no deseada.

Si eso no es importante, puede usar la versión de E / S.

La concatenación de cadena que está mostrando es perfectamente válida.Aunque la concatenación que utiliza StradStream es posible que no sea la característica más útil de los flujos de flujo, que es para poder insertar y extraer el pod y los tipos de datos abstractos.

STD :: OstringStream :: STR () crea una copia del contenido de la corriente, que duplica el uso de la memoria en algunas situaciones.Puede usar STD :: StradStream y su función RDBUF () en su lugar para evitar esto.

Más detalles aquí: Cómo escribir OstringStream directamente a COUT

¿Por qué abrir un archivo para el acceso de lectura / escritura si solo necesita leerlo, por ejemplo?

¿Qué pasa si se necesitan múltiples procesos para leer en el mismo archivo?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top