2011-05-11 21 views
5

Estoy utilizando el algoritmo de transformación y std :: toupper para lograr esto, pero ¿se puede hacer esto en una línea, así?Convierte cadena en todos los caracteres mayúsculos con std :: transform

transform(s.begin(), s.end(), ostream_iterator<string>(cout, "\n"),std::toupper); 

me sale error en esto, así que tengo que hacer una función unaria para esto y llamarlo con transformar o puedo usar algunos adaptadores?

+1

Es importante publicar el error real que está recibiendo. En particular, en un comentario a la respuesta aceptada, ha agregado ese error, y eso a su vez dice que el problema es con la resolución de sobrecarga. En ese momento, con toda la información, las personas pueden dar una explicación clara de cuál es el problema y las diferentes maneras de resolverlo, en lugar de solo un trabajo que no lo ayudará con el siguiente problema similar (resolución de sobrecarga al usar una función en una plantilla) –

+0

sí, me olvidé del error, lo siento – Kobe

Respuesta

9

Uso ostream_iterator<char> en lugar de ostream_iterator<string>:

transform(s.begin(),s.end(),ostream_iterator<char>(cout,"\n"),std::toupper); 

std::transform transforma cada personaje y lo pasará al iterador de salida. Es por eso que el argumento de tipo del iterador de salida debe ser char en lugar de std::string.

Por cierto, cada personaje se imprimirá en una nueva línea. ¿Es eso lo que quieres? Si no, no pase "\n".

-

Nota: Puede que tenga que utilizar ::toupper en lugar de std::toupper.

ver estas

+0

Veo lo que quiere decir, pero me sale el mismo error con char para: -/ – Kobe

+0

error: no hay función para llamar a 'transform (std :: basic_string :: iterator, std :: basic_string :: iterator, std :: ostream_iterator , ) ' – Kobe

+0

@vBx: Puede que tenga que usar ':: toupper' en lugar de' std :: toupper '. Vea la edición y la demostración. – Nawaz

4

primer lugar, si desea dar salida char s (y todos de char s), necesitará para usar ostreambuf_iterator<char> y no ostream_iterator<string>. Y ostreambuf_iterator<char> expresa mejor que usted que ostream_iterator<char>; está sacando char s directamente, no formateando nada. (ostream_iterator utiliza el operador <<, que formatea.)

En segundo lugar, tenga en cuenta que no siempre es una TRADUCCIÓN Aquel a uno de inferior a superior (por ejemplo 'ß' mapas a la secuencia de dos caracteres "SS" en mayúsculas) , por lo que std::transform no se puede usar realmente para hacer correctamente el trabajo . (Y, por supuesto, no maneja correctamente las codificaciones multibyte como UTF-8.) Para todos los usos menos simples, necesita algo más complicado que . Pero incluso para los casos más simples:

std::toupper está sobrecargado: una de las sobrecargas es una plantilla, que toma dos argumentos, y la otra es una función que toma un solo int; ninguno de los dos funcionará directamente aquí, y el hecho de que transform es también significa que la resolución de sobrecarga y el tipo de plantilla de deducción no funcionarán aunque lo hicieran. Entonces, básicamente, tienes que agregar algo.Es posible utilizar la función de plantilla de 2 argumentos si agrega suficientes calificadores y usa boost::bind o algo similar para enlazar el segundo argumento, pero es casi tanto texto como escribir un argumento funcional simple toupper. Y no se puede utilizar el formulario único argumento (que se puede acceder de forma inequívoca si se incluyen <ctype.h> y utilizar ::toupper) porque ha indefinido comportamiento si se utiliza un char como argumento cuando se llama a que: usted tiene que convertir el char a unsigned char primero (a menos que, por supuesto, el char llano sea sin firmar en la implementación que está usando — y en todas las implementaciones a las cuales su código alguna vez se transporta).

+0

+1, Esto realmente ataca el problema en la pregunta, en lugar de proponer ciegamente cambios. Para una solución simple que utiliza 'int toupper (int)', solo necesita un molde en el último argumento: 'std :: transform (..., (int (*) (int)) std :: toupper);' , ya que eso resolverá la sobrecarga: solo una de las sobrecargas 'toupper' se puede convertir a esa firma de función particular. –

+0

@David El problema es que usar 'int toupper (int)' da como resultado un comportamiento indefinido; no quieres usarlo directamente –

Cuestiones relacionadas