Je veux insérer des espaces 'n' (ou n'importe quelle chaîne) au début d'une chaîne en C ++. Existe-t-il un moyen direct de le faire en utilisant soit std :: strings ou char * strings?
Par exemple, en Python, vous pouvez simplement faire
>>> "." * 5 + "lolcat"
'.....lolcat'
Réponses:
Dans le cas particulier de la répétition d'un seul caractère, vous pouvez utiliser
std::string(size_type count, CharT ch)
:NB. Cela ne peut pas être utilisé pour répéter des chaînes à plusieurs caractères.
la source
Il n'y a pas de moyen idiomatique direct pour répéter des chaînes en C ++ équivalent à l' opérateur * en Python ou à l' opérateur x en Perl. Si vous répétez un seul caractère, le constructeur à deux arguments (comme suggéré par les réponses précédentes) fonctionne bien:
Ceci est un exemple artificiel de la façon dont vous pouvez utiliser un ostringstream pour répéter une chaîne n fois:
Selon l'implémentation, cela peut être légèrement plus efficace que de simplement concaténer la chaîne n fois.
la source
Utilisez l'une des formes de string :: insert:
Cela insérera "....." (cinq points) au début de la chaîne (position 0).
la source
Je sais que c'est une vieille question, mais je cherchais à faire la même chose et j'ai trouvé ce que je pense être une solution plus simple. Il semble que cout ait cette fonction intégrée avec cout.fill (), voir le lien pour une explication `` complète ''
http://www.java-samples.com/showtutorial.php?tutorialid=458
les sorties
la source
cout << "" << endl;
Aux fins de l'exemple fourni par l'OP std :: La cteur de chaîne est suffisante:
std::string(5, '.')
. Cependant, si quelqu'un cherche une fonction pour répéter std :: string plusieurs fois:la source
Comme le commodore Jaeger y a fait allusion, je ne pense pas qu'aucune des autres réponses ne réponde réellement à cette question; la question demande comment répéter une chaîne, pas un caractère.
Bien que la réponse donnée par Commodore soit correcte, elle est tout à fait inefficace. Voici une implémentation plus rapide, l'idée est de minimiser les opérations de copie et les allocations de mémoire en augmentant d'abord exponentiellement la chaîne:
Nous pouvons également définir un
operator*
pour se rapprocher de la version Python:Sur ma machine, c'est environ 10 fois plus rapide que l'implémentation donnée par Commodore, et environ 2 fois plus rapide qu'une solution naïve «ajouter n - 1 fois» .
la source
+=
intérieur de votre boucle for a également en interne une boucle qui effectue desstr.size()
itérations.str.size()
croît à chaque itération de boucle externe, donc après chaque itération externe, la boucle interne doit faire plus d'itérations. Votre et l'implémentation naïve «copie n fois» au total les deuxn * period
caractères de copie . Votre implémentation n'effectue qu'une seule allocation de mémoire en raison de l'initialreserve
. Je suppose que vous avez profilé votre implémentation avec un assez petitstr
et un grandn
, mais pas aussi avec un grandstr
et un petitn
.str
et les petitsn
entre les deux approches. Je pense que cela a plus à voir avec le pipeline global que la prédiction de branche en soi, il y a aussi des problèmes d'alignement des données à prendre en compte. Vous devriez poser une nouvelle question pour savoir pourquoi c'est plus convivial pour le processeur / la mémoire, je suis sûr que cela gagnerait beaucoup d'intérêt et recevrait une meilleure réponse que ce que je peux donner ici.rep movsb
est l'un des moyens les plus efficaces de copier, au moins pour les copies moyennes à grandes. Son implémentation micro-codée a une surcharge de démarrage quasi constante (sur AMD et Intel), par exemple sur Sandybridge, ~ 15 à 40 cycles, plus 4 cycles par ligne de cache 64B (meilleur cas) . Pour les petites copies, une boucle SSE est préférable car elle n'a pas de surcharge de démarrage. Mais alors, il est sujet à des erreurs de prédiction de la branche.Vous devriez écrire votre propre manipulateur de flux
la source
ITNOA
Vous pouvez utiliser la fonction C ++ pour ce faire.
la source