Преобразуйте строку во все заглавные буквы с помощью std :: transform - PullRequest
5 голосов
/ 11 мая 2011

Я использую алгоритм преобразования и std :: toupper для достижения этой цели, но можно ли это сделать в одну строку, например так?

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

Я получаю сообщение об ошибке, поэтому я долженсделать унарную функцию для этого и вызвать ее с помощью transform, или я могу использовать некоторые адаптеры?

Ответы [ 2 ]

9 голосов
/ 11 мая 2011

Используйте ostream_iterator<char> вместо ostream_iterator<string>:

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

std::transform преобразует каждый символ и передает его в выходной итератор. Вот почему аргумент типа выходного итератора должен быть char вместо std::string.

Кстати, каждый символ будет напечатан на новой строке. Это то, что вы хотите? Если нет, не передавайте "\n".

-

Примечание: Возможно, вам придется использовать ::toupper вместо std::toupper.

См. Эти

4 голосов
/ 11 мая 2011

Во-первых, если вы хотите вывести char с (и все char с), вы будете нужно использовать ostreambuf_iterator<char>, а не ostream_iterator<string>. И ostreambuf_iterator<char> выражает лучше, чем вы хотите, чем ostream_iterator<char>; Вы вывод char s напрямую, ничего не форматируя. (ostream_iterator использует оператор <<, который форматирует.)

Во-вторых, имейте в виду, что не всегда есть один к одному перевод от нижнего к верхнему (например, 'ß' соответствует последовательности из двух символов "SS" в верхний регистр), поэтому std::transform не может использоваться для выполнения работы правильно. (И, конечно, он не обрабатывает многобайтовые кодировки, такие как UTF-8 правильно.) Для всего, кроме простейшего использования, вам нужно что-то более сложный Но даже для самых простых случаев:

std::toupper перегружен: одна из перегрузок является шаблоном, который принимает два аргумента, а другой является функцией, которая принимает один int; ни тот, ни другой не будут работать напрямую, и тот факт, что transform также шаблон означает, что разрешение перегрузки и тип шаблона удержание не сработает, даже если они сработают. В общем, вы должны добавить что-то. Можно использовать функцию шаблона с двумя аргументами, если вы добавьте достаточно квалификаторов и используйте boost::bind или что-то похожее на связывание второй аргумент, но это почти столько же текста, сколько написание простого toupper функциональный аргумент сам. И вы не можете использовать сингл форма аргумента (к которой можно однозначно получить доступ, если включить <ctype.h> и используйте ::toupper), потому что он имеет неопределенное поведение, если вы используете char в качестве аргумента при вызове: вы должны преобразовать сначала от char до unsigned char (если, конечно, обычный char не является без знака в используемой реализации & mdash; и во всех реализации, в которые ваш код будет портирован).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...