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

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

Domanda

Quando dovrei usare std::istringstream, std::ostringstream e std::stringstream e perché non dovrei usare std::stringstream in ogni scenario (ci sono problemi di prestazioni di runtime?).

Infine, c'è qualcosa di brutto in questo (invece di usare un flusso):

std::string stHehe("Hello ");

stHehe += "stackoverflow.com";
stHehe += "!";
È stato utile?

Soluzione

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

Di solito voglio inizializzare uno stream da una stringa e poi analizzarlo;oppure eseguire lo streaming di elementi su un flusso di stringhe, quindi estrarre il risultato e archiviarlo.

Se esegui lo streaming da e verso lo stesso flusso, devi prestare molta attenzione allo stato e alle posizioni del flusso.

Usando "solo" istringstream O ostringstream esprime meglio le tue intenzioni e ti dà un po' di controllo contro errori stupidi come l'uso accidentale di << contro >>.

Potrebbe ci sarebbe qualche miglioramento delle prestazioni, ma non lo guarderei prima.

Non c'è niente di sbagliato in quello che hai scritto.Se ritieni che non funzioni abbastanza bene, potresti profilare altri approcci, altrimenti attieniti a ciò che è più chiaro.Personalmente sceglierei semplicemente:

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

Altri suggerimenti

A stringstream è un po ' 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 il tuo intento e impedirti di usare accidentalmente >> dove intendevi << (o viceversa).OTOH, la differenza è sufficientemente piccola che specialmente per bit rapidi di codice dimostrativo e simili, sono pigro e uso solo stringstream.Non riesco a ricordare l'ultima volta che ho usato accidentalmente << quando intendevo >>, quindi a me quel po ' di sicurezza sembra per lo più teorico, soprattutto perché se tu fare fai un tale errore, lo sarà quasi sempre davvero evidente quasi subito).

Niente di sbagliato nell'usare solo una stringa, purché compia ciò che vuoi.Se stai solo mettendo insieme le stringhe, è facile e funziona bene.Se si desidera formattare altri tipi di dati, un stringstream supporterà questo, e una stringa per lo più non lo farà.

Nella maggior parte dei casi, non ti troverai di aver bisogno di entrambi input e output sullo stesso stringstream, quindi utilizzare std::ostringstream e std::istringstream semplificano esplicitamente la tua intenzione.Ti impedisce inoltre di digitare accidentalmente l'operatore errato (<< VS >>).

Quando è necessario eseguire entrambe le operazioni sullo stesso flusso che ovviamente utilizzerai la versione generale.

I problemi di prestazione sarebbero l'ultima delle tue preoccupazioni qui, la chiarezza è il vantaggio principale.

Infine non c'è niente di sbagliato nell'utilizzare l'appello di stringa come devi costruire stringhe pure.Non puoi usarlo per combinare numeri come puoi in lingue come Perl.

IStringStream è per input, ostringstream per la produzione.stringstream è input e output. Puoi usare Stringstream Abbastanza ovunque. Tuttavia, se si fornisce al tuo oggetto a un altro utente, e utilizza l'operatore >> mentre tu dove aspetta un oggetto da scrittura solo, non sarai felice; -)

PS: Niente di male a riguardo, solo problemi di prestazione.

Per rispondere alla tua terza domanda: No, è perfettamente ragionevole.Il vantaggio di utilizzare i flussi è che è possibile inserire qualsiasi tipo di valore che ha un operator<< definito, mentre è possibile aggiungere solo stringhe (c ++ o c) a un std::string.

Presumibilmente quando solo l'inserimento o l'estrazione è appropriata per il funzionamento è possibile utilizzare una delle versioni prefissate 'I' o 'O' per escludere l'operazione indesiderata.

Se ciò non è importante, è possibile utilizzare la versione I / O.

La concatenazione della stringa che stai mostrando è perfettamente valida.Sebbene la concatenazione che utilizza Stringstream è possibile che non sia la caratteristica più utile dei stringstreams, che deve essere in grado di inserire ed estrarre il pod e i tipi di dati astratti.

std :: ostringstream :: str () crea una copia del contenuto del flusso, che raddoppia l'utilizzo della memoria in alcune situazioni.Puoi usare STD :: Stringstream e la sua funzione RDBUF () invece per evitare questo.

Maggiori dettagli qui: Come scrivere Ostringstream direttamente a cout

Perché aprire un file per l'accesso in lettura / scrittura Se è solo necessario leggere da esso, ad esempio?

Cosa succede se più processi necessari per leggere dallo stesso file?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top