NOTE : cette réponse a fait l'objet d'une certaine attention récemment. Je ne la préconise pas comme solution (c'est une solution que j'ai vue dans le passé, avant la STL). Il s'agit d'une approche intéressante qui ne devrait être appliquée qu'à partir de std::string
ou std::stringstream
si après avoir profilé votre code vous découvrez que cela apporte une amélioration.
J'utilise normalement soit std::string
ou std::stringstream
. Je n'ai jamais eu de problèmes avec ceux-ci. Normalement, je réserve d'abord un peu de place si je connais la taille approximative de la corde à l'avance.
J'ai vu d'autres personnes fabriquer leur propre constructeur de cordes optimisé dans un passé lointain.
class StringBuilder {
private:
std::string main;
std::string scratch;
const std::string::size_type ScratchSize = 1024; // or some other arbitrary number
public:
StringBuilder & append(const std::string & str) {
scratch.append(str);
if (scratch.size() > ScratchSize) {
main.append(scratch);
scratch.resize(0);
}
return *this;
}
const std::string & str() {
if (scratch.size() > 0) {
main.append(scratch);
scratch.resize(0);
}
return main;
}
};
Il utilise deux cordes : une pour la majorité de la corde et l'autre comme zone de grattage pour concaténer des cordes courtes. Il optimise les ajouts en regroupant les opérations d'ajouts courts dans une petite chaîne, puis en l'ajoutant à la chaîne principale, ce qui réduit le nombre de réaffectations nécessaires sur la chaîne principale lorsqu'elle devient plus grande.
Je n'ai pas eu besoin de cette astuce avec std::string
ou std::stringstream
. Je pense que c'était utilisé avec une bibliothèque de chaînes de caractères tierce avant std::string, c'était il y a longtemps. Si vous adoptez une telle stratégie, commencez par profiler votre application.
3 votes
La réponse courte est : Oui, STL a une classe pour cela et c'est
std::ostringstream
.0 votes
Salut @andrew. Pouvez-vous modifier la réponse acceptée ? Il y a une réponse gagnante claire et ce n'est pas la réponse acceptée actuellement.
1 votes
@null c'est fait !