我应该如何定义 lambda 以从 string iterator
获取 char
?在下面的代码中,lambda detect_bracket
输入参数 x
有问题。
我不想从字符串中删除 ALL 括号,只是在开头和结尾。
auto detect_bracket = [](char* x){ return(')' == x || '(' == x);};
this->str.erase(std::remove_if(str.begin(), str.begin(),
detect_bracket)
);
this->str.erase(std::remove_if(str.back(), str.back(),
detect_bracket)
);
最佳答案
您应该将 char
作为带有 std::remove_if
的 lambda 的参数类型,因为谓词函数的签名应该直接检查元素。
auto detect_bracket = [](char x){ return(')' == x || '(' == x);};
this->str.erase(std::remove_if(str.begin(), str.end(),
detect_bracket)
);
注意 std::string::back()
不能与 std::remove_if
一起使用。它将返回一个 char
并且 std::remove_if
期望一个由迭代器表示的范围。
而str.begin(), str.begin()
只是一个空范围,如果你只是想删除开始和结束的元素,你可以
auto detect_bracket = [](char x){ return(')' == x || '(' == x);};
if (!this->str.empty()) {
this->str.erase(std::remove_if(str.begin(), str.begin() + 1, detect_bracket), str.begin() + 1);
}
if (!this->str.empty()) {
this->str.erase(std::remove_if(str.end() - 1, str.end(), detect_bracket), str.end());
}
请注意,我们需要为 std::string::erase
指定正确的结束迭代器,因为 std::remove_if
将返回一个迭代器,即使它什么也没找到,然后字符会被错误地删除。
关于c++ - lambda 采用 `char` 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36737630/