Il existe en fait une fonction similaire à l'inexistant std::string::push_front
voir l'exemple ci-dessous.
Documentation de std::string::insert
#include <iostream>
#include <string>
int
main (int argc, char *argv[])
{
std::string s1 (" world");
std::string s2 ("ello");
s1.insert (0, s2); // insert the contents of s2 at offset 0 in s1
s1.insert (0, 1, 'h'); // insert one (1) 'h' at offset 0 in s1
std::cout << s1 << std::endl;
}
sortie :
hello world
Étant donné que l'ajout de données au début d'une chaîne de caractères peut nécessiter à la fois une réaffectation et une copie/déplacement des données existantes, vous pouvez obtenir des gains de performances en vous débarrassant de la partie réaffectation en utilisant std::string::reserve
(pour allouer plus de mémoire à l'avance).
Le copier/déplacer de données est malheureusement inévitable, à moins que vous ne définissiez votre propre classe personnalisée qui agisse comme std::string
qui alloue un grand tampon et place le premier contenu au centre de ce tampon mémoire.
Vous pouvez alors ajouter et ajouter des données sans réaffectation ni déplacement de données, à condition que le tampon soit suffisamment grand. La copie de source a destination est toujours, évidemment, nécessaire.
Si vous avez un tampon dans lequel vous savez que vous allez Préparez données plus souvent que vous ajouter une bonne alternative est de stocker la chaîne à l'envers, et de l'inverser en cas de besoin (si cela est plus rare).
5 votes
Une raison pour laquelle vous ne pouvez pas faire quelque chose comme
s = a + s
?0 votes
Qu'est-ce que tu veux dire par "prepend" ? Est-ce que c'est ce que @MikeBantegui a mentionné ? ou vous essayez de faire quelque chose d'autre ?
0 votes
Prépendre à une chaîne de caractères ne va pas être efficace, peut-être serait-il préférable d'ajouter à la chaîne de caractères et de l'inverser lorsque vous avez terminé ?
0 votes
@GWW : Est-ce vraiment plus efficace ?
0 votes
Voulez-vous dire prepend à a
std::string
? Alors prépendre quoi ?0 votes
@TomalakGeret'kal : A chaque fois que tu ajoutes le prépas, je suppose que la chaîne entière doit être déplacée en utilisant une sorte de
memcpy
fonctionnement.0 votes
Oui, probablement, une fois. En quoi est-ce pire que de boucler sur la chaîne originale et de copier les données un octet à la fois ? Je ne connais pas de fonction API de bas niveau pour inverser les données dans un bloc de mémoire.
0 votes
@TomalakGeret'kal : Désolé, je me suis mal expliqué. Je voulais dire que si l'afficheur est répétitivement en train de précéder la chaîne de caractères, il peut être plus efficace d'ajouter et d'inverser la chaîne de caractères après que tous les ajouts soient terminés.
0 votes
@GWW : OK. C'est toujours improbable ; vous feriez mieux de savoir combien de nouveaux caractères vous avez besoin, et de les exécuter tous en même temps dans une seule chaîne. Il est peu probable que l'inversion vous donne quelque chose. D'autant plus qu'il faudrait aussi pré-inverser la chaîne originale.