你能帮我解释一下如何使用std::transform
吗?我需要创建一个返回字符串并将字符串作为参数的函数并使用std::transform
将所有大写字符转换为小写字符,反之亦然,将小写字符转换为大写字符示例:input=";aBc";输出=";AbC";
我想用lambda来做,而不是用其他方法,比如toupper等。
到目前为止,这是我所拥有的,它不起作用,它编译并运行,但它什么都不返回/空字符串;
std::string func(std::string inputString){
std::string result;
std::transform(inputString.begin(), inputString.end(), result.begin(), [](char& c){
if (c < 97) return c + 32;
if (c >= 97) return c - 32;
});
return result;
}
您在result
中没有分配任何空间,所以您观察到了一个漂亮的"温柔的";未定义行为的情况("温和"是因为程序明显不工作,而不是纯粹靠运气工作(。
为了解决这个问题,您可以在调用std::transform
之前分配这样的内存,例如通过
result.resize(inputString.size());
或者对result
使用back_inserter
(而不是其开始迭代器result.begin()
(,后者将负责分配;CCD_ 8上的页面就是这样一个例子。在后一种情况下,通过保留一些空间可能仍然是个好主意
result.reserve/* not resize! */(inputString.size());
问题原因:
您没有为result
分配内存。
您可以通过以下方式之一应对:
- 在调用
std::transform
之前,使用std::string::resize
显式分配内存:
result.resize(inputString.length());
- 调用
std::transform
时使用std::back_inserter
而不是result.begin()
:
std::transform(inputString.begin(), inputString.end(), std::back_inserter(result), [](char& c) {
注意:您的lambda主体可以简化为:
if (c < 97) return c + 32;
return c - 32;
它还将修复编译器警告(MSVC至少抱怨lambda并不总是返回值(。