for_each c++ string stl transform

for_each - C++ std:: transform() y toupper()..why ¿esto falla?



string toupper c++ (3)

Tengo 2 std :: string. Solo quiero, dada la cadena de entrada:

  1. poner en mayúscula cada letra
  2. asigne la letra mayúscula a la cadena de salida.

¿Cómo es que esto funciona?

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

pero esto no lo hace (resulta en un bloqueo del programa)?

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

porque esto funciona (al menos en la misma cadena:

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


Diría que el iterador devuelto por out.begin() no es válido después de un par de incrementos para la cadena vacía. Después de la primera ++ es ==out.end() , entonces el comportamiento después del siguiente incremento no está definido.

Después de todo esto exactamente para qué insertar el iterador.


Ese es el sentido de un backinserter: inserta elementos en un contenedor. utilizando begin (), pasa un iterador a un contenedor vacío y modifica los iteradores no válidos.

Lo siento, mis ediciones interfirieron con tus comentarios. Primero publiqué algo mal accidentalmente.


No hay espacio en el out . Los algoritmos de C ++ no hacen crecer sus contenedores de destino automáticamente. Debe hacer el espacio usted mismo o usar un adaptador insertador.

Para hacer espacio en el out , haz esto:

out.resize(s.length());

[editar] Otra opción es crear la cadena de salida con el tamaño correcto con este constructor.

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