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:
- poner en mayúscula cada letra
- 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'');