c++ ::使用std::transform降低[复制]

dsekswqp  于 2022-11-27  发布在  其他
关注(0)|答案(2)|浏览(204)

此问题在此处已有答案

why does my std::transform retuns nothing/empty string?(2个答案)
4天前关闭。
为什么std::transform不能以这种方式工作:

std::string tmp = "WELCOME";
std::string out = "";
std::transform(tmp.begin(), tmp.end(), out.begin(), ::tolower);

输出为空!
但这是可行的:

std::transform(tmp.begin(), tmp.end(), tmp.begin(), ::tolower);

我不希望就地进行转型。

cyvaqqii

cyvaqqii1#

由于out的范围小于tmp的范围,因此您正在超出范围的内存中写入。您可以通过应用std::back_inserter将结果存储到out中。
正如user17732522所指出的,由于it's not legal to take the adress of a standard libary function,最好在需要时传递一个在角色上调用std::tolower的lambda对象。

std::transform(tmp.begin(), tmp.end(), std::back_inserter(out), [](auto c) {
    return std::tolower(static_cast<unsigned char>(c));
});
kyks70gy

kyks70gy2#

一种方法是调整字符串的大小,以便为std::transform分配足够的内存来填充它。

out.resize(tmp.size()); // <---
std::transform(tmp.begin(), tmp.end(), out.begin(), ::tolower);

或者,正如其他人提到的,你可以使用std::back_inserter,它为你处理插入。我们也可以调用out.reserve来保存分配时间(特别是当你的字符串很大的时候)。

out.reserve(tmp.size()); // (optional) Smol optimisation.
std::transform(tmp.begin(), tmp.end(), std::back_inserter(out), ::tolower);

相关问题