Domanda

Vorrei cancellare e riutilizzare un ostringstream (e il buffer sottostante) in modo che la mia app non debba fare altrettante allocazioni. Come resettare l'oggetto al suo stato iniziale?

È stato utile?

Soluzione

Ho usato una sequenza di clear e str in passato:

// clear, because eof or other bits may be still set. 
s.clear();
s.str("");

Che ha fatto la cosa sia per i flussi di stringhe di input che di output. In alternativa, puoi cancellare manualmente, quindi cercare la sequenza appropriata per iniziare:

s.clear();
s.seekp(0); // for outputs: seek put ptr to start
s.seekg(0); // for inputs: seek get ptr to start

Ciò impedirà alcune riallocazioni effettuate da str sovrascrivendo invece ciò che è attualmente nel buffer di output. I risultati sono così:

std::ostringstream s;
s << "hello";
s.seekp(0);
s << "b";
assert(s.str() == "bello");

Se si desidera utilizzare la stringa per le funzioni c, è possibile utilizzare std :: End , inserendo un valore finale nullo in questo modo:

std::ostringstream s;
s << "hello";
s.seekp(0);
s << "b" << std::ends;
assert(s.str().size() == 5 && std::strlen(s.str().data()) == 1);

std :: End è un relitto del std :: strstream obsoleto, che è stato in grado di scrivere direttamente su un array di caratteri allocato nello stack. È stato necessario inserire manualmente un null di chiusura. Tuttavia, std :: End non è deprecato, penso perché è ancora utile come nei casi precedenti.

Altri suggerimenti

Sembra che la chiamata ostr.str (" ") faccia il trucco.

Se hai intenzione di cancellare il buffer in un modo che lo farà cancellare prima del suo primo utilizzo, dovrai prima aggiungere qualcosa al buffer con MSVC.

struct Foo {
    std::ostringstream d_str;
    Foo() { 
        d_str << std::ends;   // Add this
    }
    void StrFunc(const char *);
    template<class T>
    inline void StrIt(const T &value) {
        d_str.clear();
        d_str.seekp(0);  // Or else you'll get an error with this seek
        d_str << value << std::ends;
        StrFunc(d_str.str().c_str());  // And your string will be empty
    }
};

Non lo fai. Usa due flussi con nomi diversi per maggiore chiarezza e lascia che il compilatore ottimizzatore capisca che può riutilizzare quello vecchio.

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