réinitialiser une chaîne de caractères

Comment “réinitialiser” l’état d’une chaîne de caractères à ce qu’elle était quand je l’ai créée?

int firstValue = 1; int secondValue = 2; std::wssortingngstream 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’est comme ça que je le fais habituellement:

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

je ferais

 std::wssortingngstream 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 object ssortingngstream sur la stack et échange tout ce qui est en ss avec ceux du nouvel object.

Avantages:

  1. Il garantit que le ss sera maintenant dans un état nouveau.
  2. Le nouvel object est créé en ligne et sur la stack, afin que le compilateur puisse facilement optimiser le code. À la fin, cela reviendra à réinitialiser toutes les données internes de ss à leur état initial.

Plus:

  1. Par rapport à l’opérateur d’affectation: les méthodes d’échange SWL peuvent être plus rapides que l’opérateur d’affectation dans les cas où le nouvel object possède un tampon alloué dans le tas. Dans un tel cas, l’opérateur d’affectation doit allouer le tampon pour le nouvel object, puis il PEUT avoir besoin d’allouer un autre tampon pour l’ancien object, puis copier les données du tampon du nouvel object dans le nouveau tampon de l’ancien object. Il est très facile d’implémenter un swap 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 mouvement plus lente que swap, bien que cela puisse être corrigé, mais le développeur STL ne voudra probablement pas laisser un object déplacé avec beaucoup de données

  3. std::move() ne garantit pas que l’object déplacé est vidé. return std::move(m_container); ne supprime pas m_container. Donc, vous devrez faire

    auto to_return (std :: move (m_container)); m_container.clear (); retourner à_retour;

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() aussi longtemps qu’il convient.

Sur la base de la réponse ci-dessus, nous devons également réinitialiser tout formatage. En tout, nous réinitialisons le contenu du tampon, les indicateurs d’état du stream et tout formatage à leurs valeurs par défaut lorsqu’une nouvelle instance std :: ssortingngstream est construite.

 void reset(std::ssortingnstream& stream) { const static std::ssortingngstream initial; stream.str(std::ssortingng()); stream.clear(); stream.copyfmt(initial); }