为什么我的std::transform不返回任何内容/空字符串



你能帮我解释一下如何使用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分配内存。

您可以通过以下方式之一应对:

  1. 在调用std::transform之前,使用std::string::resize显式分配内存:
result.resize(inputString.length());
  1. 调用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并不总是返回值(。

相关内容

最新更新