c++ - mystr - ¿Cuál es la diferencia entre istringstream, ostringstream y stringstream?/¿Por qué no utilizar stringstream en todos los casos?
stringstream mystr (7)
¿Cuándo usaría std::istringstream
, std::ostringstream
y std::stringstream
y por qué no debería usar std::stringstream
en cada escenario (¿hay problemas de rendimiento en el tiempo de ejecución?).
Por último, ¿hay algo malo sobre esto (en lugar de usar una transmisión)?
std::string stHehe("Hello ");
stHehe += "stackoverflow.com";
stHehe += "!";
¿Por qué abrir un archivo para acceso de lectura / escritura si solo necesita leer de él, por ejemplo?
¿Qué sucede si se necesitan múltiples procesos para leer desde el mismo archivo?
En la mayoría de los casos, no encontrará que necesita tanto entrada como salida en el mismo flujo de cadenas, por lo que usar std::ostringstream
y std::istringstream
explícitamente deja en claro su intención. También evita que accidentalmente escriba el operador incorrecto ( <<
vs >>
).
Cuando necesite hacer ambas operaciones en la misma transmisión, 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.
Por último, no hay nada de malo en usar el apéndice de cadena ya que tiene que construir cadenas puras. Simplemente no puede usar eso para combinar números como puede en idiomas como perl.
Es de suponer que cuando solo sea apropiada su operación de inserción o solo extracción, podría utilizar una de las versiones con prefijo ''i'' u ''o'' para excluir la operación no deseada.
Si eso no es importante, entonces puede usar la versión de E / S.
La concatenación de cadenas que está mostrando es perfectamente válida. Aunque es posible la concatenación con stringstream, esa no es la característica más útil de las cadenas de caracteres, que es la de poder insertar y extraer POD y tipos de datos abstractos.
Para responder a su tercera pregunta: No, eso es perfectamente razonable. La ventaja de usar flujos es que puede ingresar cualquier clase de valor que tenga un operator<<
definido, mientras que solo puede agregar cadenas (ya sea C ++ o C) a std::string
.
Personalmente, me parece muy raro que quiera realizar la transmisión hacia y desde el mismo flujo de cadenas.
Por lo general, quiero inicializar un flujo de una cadena y luego analizarlo; o transmitir cosas a una secuencia de cadenas y luego extraer el resultado y almacenarlo.
Si está transmitiendo desde y hacia la misma transmisión, debe tener mucho cuidado con el estado de la transmisión y las posiciones de transmisión.
El uso de ''solo'' istringstream
o ostringstream
expresa mejor su intención y le da cierta comprobación contra errores tontos como el uso accidental de <<
vs >>
.
Puede haber alguna mejora en el rendimiento, pero yo no estaría mirando eso primero.
No hay nada malo con lo que has escrito. Si encuentra que no funciona lo suficientemente bien, entonces puede perfilar otros enfoques, de lo contrario, se adhieren a lo que es más claro. Personalmente, iría por:
std::string stHehe( "Hello .com!" );
Un stringstream
es algo más grande y puede tener un rendimiento ligeramente inferior: la herencia múltiple puede requerir un ajuste en el puntero vtable. La principal diferencia es (al menos en teoría) expresar mejor su intención y evitar que accidentalmente use >>
donde pretendía <<
(o viceversa). OTOH, la diferencia es suficientemente pequeña, especialmente para bits rápidos de código de demostración y tal, soy flojo y solo uso stringstream
. No puedo recordar la última vez que utilicé <<
cuando quise >>
accidentalmente, así que para mí ese poco de seguridad parece más bien teórico (especialmente porque si cometes un error así, casi siempre será realmente obvio casi inmediatamente).
No hay nada malo con solo usar una cadena, siempre que logre lo que quiere. Si solo estás poniendo cuerdas, es fácil y funciona bien. Sin embargo, si desea formatear otros tipos de datos, un stringstream
lo admitirá, y una cadena en su mayoría no lo hará.
istringstream es para entrada, ostringstream para salida. stringstream es entrada y salida. Puedes usar stringstream prácticamente en todas partes. Sin embargo, si le das tu objeto a otro usuario, y usa el operador >> mientras que estás esperando un objeto de solo escritura, no serás feliz ;-)
PD: nada malo, solo problemas de rendimiento.