web-dev-qa-db-fra.com

réinitialisation d'une chaîne de caractères

Comment "réinitialiser" l'état d'un flux de chaînes à ce qu'il était lorsque je l'ai créé?

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
75
user974967

Voici la façon dont je le fais habituellement:

ss.str("");
ss.clear(); // Clear state flags.
122
Darcy Rayner

Je ferais

std::wstringstream temp;
ss.swap(temp);

Edit: correction de l'erreur signalée par christianparpart et Nemo. Merci.

PS: Le code ci-dessus crée un nouvel objet stringstream sur la pile et échange tout dans ss avec ceux du nouvel objet.

Avantages:

  1. Il garantit que ss sera désormais dans un état neuf.
  2. Le nouvel objet est créé en ligne et sur la pile, afin que le compilateur puisse facilement optimiser le code. À la fin, ce sera comme réinitialiser toutes les données internes de ss à leur état initial.

Plus:

  1. Comparé à l'opérateur d'affectation: les méthodes d'échange de STL peuvent être plus rapides que l'opérateur d'affectation dans les cas où le nouvel objet a un tampon alloué dans le tas. Dans un tel cas, l'opérateur d'affectation doit allouer le tampon pour le nouvel objet, il PEUT alors avoir besoin d'allouer un autre tampon pour l'ancien objet, puis de copier les données du tampon du nouvel objet vers le nouveau tampon de l'ancien objet. Il est très facile d'implémenter un échange rapide, qui permute simplement les pointeurs des tampons par exemple.

  2. C++ 11. J'ai vu une implémentation de l'opérateur d'affectation de déplacement qui est plus lente que l'échange, bien que cela puisse être corrigé, mais le développeur STL ne voudra probablement pas laisser un objet déplacé avec beaucoup de données

  3. std::move() ne garantit pas que l'objet déplacé est vidé. return std::move(m_container); n'efface pas m_container. Vous devrez donc faire

    auto to_return (std :: move (m_container)); m_container.clear (); return to_return;

Ce qui ne peut pas être mieux que

auto to_return;
m_container.swap(to_return);
return to_return;

car ce dernier garantit qu'il ne copiera pas les tampons.

Donc, je préfère toujours swap() tant qu'il convient.

6
Yong

En s'appuyant sur la réponse ci-dessus, nous devons également réinitialiser toute mise en forme. Dans tout, nous réinitialisons le contenu du tampon, les drapeaux d'état du flux et tout formatage à leurs valeurs par défaut lorsqu'une nouvelle instance std :: stringstream est construite.

void reset(std::strinstream& stream)
{
    const static std::stringstream initial;

    stream.str(std::string());
    stream.clear();
    stream.copyfmt(initial);
}
1
GameSalutes