c++ - lambda 采用 `char` 参数

标签 c++ string c++11 lambda

我应该如何定义 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 将返回一个迭代器,即使它什么也没找到,然后字符会被错误地删除。

LIVE

关于c++ - lambda 采用 `char` 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36737630/

相关文章:

c++ - 将(行)从二维数组复制到一维数组

请求从 C++ 到非标量类型的转换

android - 字符串在android中追加格式

c++ - 模板特化存在 ODR 违规

c++ - 大型抽象基类

c++ - 为什么该代码不绘制 Sprite C++ SFML

c++ - 该程序未打印整个字符串

java - 如何从字符串中过滤出唯一元素并将其存储到 ArrayList 中

c++11 - 为什么我不能专门化 std::tuple_element?

c++ - 这是交换(多线程)的异常安全实现吗?