使用 std::transform 将字符串转换为全部大写字母

发布于 2024-11-06 06:24:20 字数 227 浏览 1 评论 0原文

我正在使用变换算法和 std::toupper 来实现这一点,但是这可以像这样在一行中完成吗?

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

我在这方面遇到错误,所以我是否必须为此创建一个一元函数并使用转换来调用它,或者我可以使用一些适配器?

I'm using transform algorithm and std::toupper to achieve this, but can this be done in one line, like this ?

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

I get error on this, so do I have to make a unary function for this and call it with transform or I can use some adaptors ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

小草泠泠 2024-11-13 06:24:20

使用 ostream_iterator 而不是 ostream_iterator

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

std::transform 转换每个字符并将其传递给输出迭代器。这就是为什么输出迭代器的类型参数应该是 char 而不是 std::string

顺便说一下,每个字符都会打印在换行符上。这就是你想要的吗?如果不是,请不要传递 "\n"

--

注意: 您可能必须使用 ::toupper 而不是 std::toupper

请参阅这些

Use ostream_iterator<char> instead of ostream_iterator<string>:

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

std::transform transforms each character and pass it to the output iterator. That is why the type argument of the output iterator should be char instead of std::string.

By the way, each character will be printed on a newline. Is that what you want? If not, don't pass "\n".

--

Note : You may have to use ::toupper instead of std::toupper.

See these

另类 2024-11-13 06:24:20

首先,如果您想输出 char(以及所有 char),您将
需要使用ostreambuf_iterator,而不是
ostream_iterator。并且 ostreambuf_iterator 表示
ostream_iterator 更好你想要的;你是
直接输出char,不格式化任何内容。
ostream_iterator 使用 << 运算符进行格式化。)

其次,请注意,并不总是存在一对一的翻译
从下到上(例如 'ß' 映射到两个字符序列 "SS"
大写),所以 std::transform 不能真正用于完成这项工作
正确。 (当然,它不处理多字节编码,例如
UTF-8 正确。)对于除了最简单的用途之外的所有用途,您需要一些东西
更复杂。但即使对于最简单的情况:

std::toupper 也被重载:重载之一是模板,它
接受两个参数,另一个是一个接受单个参数的函数
int;两者都不能直接在这里工作,事实上 transform
模板也意味着重载解析和模板类型
即使他们这样做了,扣除也不会起作用。所以基本上,你必须添加
某物。如果您满足以下条件,则可以使用 2 个参数模板函数
添加足够的限定符并使用 boost::bind 或类似绑定的东西
第二个参数,但它几乎和写一个简单的文本一样多
toupper 函数论证你自己。而且你不能使用单一
参数形式(如果包含,则可以明确访问
并使用 ::toupper) 因为它具有未定义的行为,如果
当你调用它时,你使用 char 作为参数:你必须转换
首先将 char 转换为 unsigned char (当然,除非是普通的 char
在您正在使用的实现中以及所有中都未签名
您的代码将被移植到的实现)。

First, if you want to output chars (and all of the chars), you'll
need to use ostreambuf_iterator<char>, and not
ostream_iterator<string>. And ostreambuf_iterator<char> expresses
better what you want than ostream_iterator<char>; you're
outputting chars directly, not formatting anything.
(ostream_iterator uses the << operator, which formats.)

Second, be aware that there is not always a one to one translation of
lower to upper (e.g. 'ß' maps to the two character sequence "SS" in
upper case), so std::transform can't really be used to do the job
correctly. (And of course, it doesn't handle multibyte encodings like
UTF-8 correctly.) For all but the simplest uses, you need something
more complicated. But even for the simplest cases:

std::toupper is overloaded: one of the overloads is a template, which
takes two arguments, and the other is a function which takes a single
int; neither will work directly here, and the fact that transform is
also a template means that overload resolution and template type
deduction won't work even if they did. So basically, you have to add
something. It's possible to use the 2 argument template function if you
add enough qualifiers and use boost::bind or something similar to bind
the second argument, but it's almost as much text as writing a simple
toupper functional argument your self. And you can't use the single
argument form (which can be unambiguously accessed if you include
<ctype.h> and use ::toupper) because it has undefined behavior if
you use a char as the argument when you call it: you have to convert
the char to unsigned char first (unless, of course, plain char is
unsigned in the implementation you are using—and in all
implementations to which your code will ever be ported).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文