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
Voici la façon dont je le fais habituellement:
ss.str("");
ss.clear(); // Clear state flags.
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:
ss
sera désormais dans un état neuf.ss
à leur état initial.Plus:
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.
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
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.
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);
}