Jak „zresetować” stan stringstream do tego, jaki był, kiedy go utworzyłem?
int firstValue = 1;
int secondValue = 2;
std::wstringstream ss;
ss << "Hello: " << firstValue;
std::wstring firstText(ss.str());
//print the value of firstText here
//How do I "reset" the stringstream here?
//I would like it behave as if I had created
// stringstream ss2 and used it below.
ss << "Bye: " << secondValue;
std::wstring secondText(ss.str());
//print the value of secondText here
c++
string
stringstream
user974967
źródło
źródło
clear
nie resetuje manipulatorów io. Przykład testu zakończonego niepowodzeniem: std :: stringstream ss; ss << "Witaj" << std :: setw (15) << "Świat" << std :: setw (15); reset (ss); ss << "Witaj świecie"; assert ("Witaj świecie" == buf.str ()); // nie udaje się, odbiera ostatni std :: setwchciałbym zrobić
std::wstringstream temp; ss.swap(temp);
Edycja: naprawiono błąd zgłoszony przez christianparpart i Nemo. Dzięki.
PS: Powyższy kod tworzy nowy obiekt stringstream na stosie i zamienia wszystko
ss
z obiektami w nowym obiekcie.Zalety:
ss
będzie teraz w świeżo nowym stanie.ss
danych wewnętrznych do stanu początkowego.Jeszcze:
W porównaniu z operatorem przypisania: metody wymiany STL mogą być szybsze niż operator przypisania w przypadkach, gdy nowy obiekt ma przydzielony bufor w stercie. W takim przypadku operator przypisania musi przydzielić bufor dla nowego obiektu, wtedy MOŻE być zmuszony przeznaczyć inny bufor dla starego obiektu, a następnie skopiować dane z bufora nowego obiektu do nowego bufora starego obiektu. Bardzo łatwo jest zaimplementować szybką zamianę, która po prostu zamienia na przykład wskaźniki buforów.
C ++ 11. Widziałem pewną implementację operatora przypisania przenoszenia, która jest wolniejsza niż swap, chociaż można to naprawić, ale prawdopodobnie programista STL nie będzie chciał zostawić przeniesionego obiektu z dużą ilością danych
std::move()
nie gwarantuje, że przeniesiony obiekt zostanie opróżniony.return std::move(m_container);
nie czyści m_container. Więc będziesz musiał zrobićauto to_return (std :: move (m_container)); m_container.clear (); return to_return;
Co nie może być lepsze niż
auto to_return; m_container.swap(to_return); return to_return;
ponieważ ta ostatnia gwarantuje, że nie skopiuje buforów.
Więc zawsze wolę
swap()
tak długo, jak pasuje.źródło
Opierając się na powyższej odpowiedzi, musimy również zresetować wszelkie formatowanie. We wszystkim resetujemy zawartość bufora, flagi stanu strumienia i wszelkie formatowanie do wartości domyślnych, gdy konstruowana jest nowa instancja std :: stringstream.
void reset(std::strinstream& stream) { const static std::stringstream initial; stream.str(std::string()); stream.clear(); stream.copyfmt(initial); }
źródło