32 votes

C++ std::transform() et toupper() .. pourquoi cela échoue-t-il ?

J'ai 2 std::string. Je veux juste, étant donné la chaîne d'entrée :

  1. capitaliser chaque lettre
  2. assigner la lettre capitale à la chaîne de sortie.

Pourquoi cela fonctionne :

  std::string s="hello";
  std::string out;
  std::transform(s.begin(), s.end(), std::back_inserter(out), std::toupper);

mais cela ne fonctionne pas (se termine par un crash du programme) ?

  std::string s="hello";
  std::string out;
  std::transform(s.begin(), s.end(), out.begin(), std::toupper);

car cela fonctionne (au moins sur la même chaîne) :

  std::string s="hello";
  std::string out;
  std::transform(s.begin(), s.end(), s.begin(), std::toupper);

48voto

hrnt Points 5835

Il n'y a pas d'espace dans out. Les algorithmes C++ ne font pas automatiquement croître leurs conteneurs cibles. Vous devez soit créer l'espace vous-même, soit utiliser un adaptateur d'insertion.

Pour créer de l'espace dans out, faites ceci :

out.resize(s.length());

[éditer] Une autre option est de créer la chaîne de sortie avec la taille correcte en utilisant ce constructeur.

std::string out(s.length(), 'X');

2voto

Je dirais que l'itérateur retourné par out.begin() n'est pas valide après quelques incréments pour la chaîne vide. Après le premier ++, c'est ==out.end(), ensuite le comportement après l'incrémentation suivante est indéfini.

Après tout cela, à quoi sert exactement l'itérateur d'insertion.

0voto

RED SOFT ADAIR Points 5762

C'est le rôle d'un backinserter : Il insère des éléments dans un conteneur. En utilisant begin(), vous passez un itérateur à un conteneur vide et modifiez des itérateurs invalides.

Je suis désolé - mes modifications ont interféré avec vos commentaires. J'ai d'abord posté quelque chose de faux par erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X