Qual è la differenza tra istringstream, ostringstream e stringstream? / Perché non usare stringstream in ogni caso?


163

Quando si usa std::istringstream, std::ostringstreame std::stringstreame perché non dovrei semplicemente utilizzare std::stringstreamin ogni situazione (ci sono eventuali problemi di prestazioni di runtime?).

Infine, c'è qualcosa di negativo in questo (invece di usare uno stream):

std::string stHehe("Hello ");

stHehe += "stackoverflow.com";
stHehe += "!";

Risposte:


119

Personalmente, trovo molto raro che io voglia eseguire lo streaming dentro e fuori dallo stesso flusso di stringhe.

Di solito voglio inizializzare uno stream da una stringa e quindi analizzarlo; oppure trasmetti le cose in un flusso di stringhe, quindi estrai il risultato e memorizzalo.

Se esegui lo streaming da e verso lo stesso stream, devi fare molta attenzione allo stato e alle posizioni dello stream.

Usando 'solo' istringstreamo ostringstreamesprime meglio il vostro intento e ti dà un po 'di controllo contro errori stupidi come l'uso accidentale di <<vs >>.

Ci potrebbe essere qualche miglioramento di prestazioni, ma non sarebbe guardando quella prima.

Non c'è niente di sbagliato in ciò che hai scritto. Se scopri che non funziona abbastanza bene, allora potresti profilare altri approcci, altrimenti attenersi a ciò che è più chiaro. Personalmente, vorrei solo per:

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

22

A stringstreamè leggermente più grande e potrebbe avere prestazioni leggermente inferiori: l'ereditarietà multipla può richiedere una regolazione del puntatore vtable. La differenza principale è (almeno in teoria) esprimere meglio le tue intenzioni e impedirti di usare accidentalmente >>dove volevi <<(o viceversa). OTOH, la differenza è sufficientemente piccola che, specialmente per brevi bit di codice dimostrativo e simili, sono pigro e basta usare stringstream. Non riesco a ricordare l'ultima volta che ho usato per sbaglio <<quando ho inteso >>, quindi per me quel po 'di sicurezza sembra in gran parte teorica (soprattutto perché se si fa fare un simile errore, sarà quasi sempre davvero evidente quasi subito).

Non c'è niente di male nell'usare una stringa, purché realizzi ciò che desideri. Se stai solo mettendo insieme le stringhe, è facile e funziona bene. Se vuoi formattare altri tipi di dati, però, stringstreamlo supporterà e una stringa per lo più no.


17

Nella maggior parte dei casi, non ti troverai ad avere bisogno sia dell'input che dell'output sullo stesso flusso di stringhe, quindi l'utilizzo std::ostringstreame std::istringstreamchiarisce esplicitamente la tua intenzione. Ti impedisce anche di digitare accidentalmente l'operatore errato ( <<vs >>).

Quando è necessario eseguire entrambe le operazioni sullo stesso flusso, è necessario utilizzare ovviamente la versione generica.

I problemi di prestazioni sarebbero il minimo dei tuoi dubbi qui, la chiarezza è il vantaggio principale.

Infine, non c'è niente di sbagliato nell'uso di append di stringa in quanto devi costruire stringhe pure. Non puoi semplicemente usarlo per combinare numeri come puoi in lingue come il perl.


8

istringstream è per input, ostringstream per output. stringstream è input e output. Puoi usare stringstream praticamente ovunque. Tuttavia, se dai il tuo oggetto a un altro utente e utilizza l'operatore >> mentre tu dove aspetti un oggetto di sola scrittura, non sarai felice ;-)

PS: niente di male, solo problemi di prestazioni.


2

Per rispondere alla tua terza domanda: No, è perfettamente ragionevole. Il vantaggio dell'utilizzo di stream è che puoi inserire qualsiasi tipo di valore che abbia un valore operator<<definito, mentre puoi solo aggiungere stringhe (C ++ o C) a a std::string.


1

Presumibilmente quando solo l'inserimento o solo l'estrazione sono appropriati per la tua operazione, puoi usare una delle versioni con prefisso 'i' o 'o' per escludere l'operazione indesiderata.

Se ciò non è importante, è possibile utilizzare la versione i / o.

La concatenazione di stringhe che stai mostrando è perfettamente valida. Sebbene sia possibile la concatenazione mediante stringstream, questa non è la caratteristica più utile dei flussi di stringhe, ovvero essere in grado di inserire ed estrarre POD e tipi di dati astratti.



0

Perché aprire un file per l'accesso in lettura / scrittura se è necessario solo leggerlo, ad esempio?

Cosa succede se più processi devono leggere dallo stesso file?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.