为什么在处理字符串时std :: count将常量传递给lambda而不是char?

bir*_*n04 1 c++ stl

我有一个字符串,想要计算其中的某些元素。我写了一个代码:

#include <iostream>
#include <set>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main(){
    string a;
    cin >> a;
    int b = count(a.begin(), a.end(), [](char g) {return (g == '"' or g == '.' or g == ',' or g == ';' or g == ':' or g == '!' or g == '?');});
    cout << b;
}
Run Code Online (Sandbox Code Playgroud)

由于std :: count应该返回等于另一个元素(指定为函数的第三个参数)的元素数,或者通过将元素一对一传递给该函数而满足某个函数的元素数,因此我希望它可以将chars传递给我lambda函数。我在CPPreference的最后一个示例中撰写了大部分内容,但是看起来它的工作方式并非我期望的那样。在编译期间,我的lambda函数遇到错误:

/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/predefined_ops.h:241:17:错误:无效的操作数转换为二进制表达式(“ char”和“ const(/home/keddad/CLionProjects/olimp/main.cpp:12:39处的lambda)”)){return * __ it == _M_value; }

因此,似乎count将某种常量传递给我的little函数,稍后它将尝试将其与char比较(并丢弃错误)。如何使我的代码正常工作?std :: count实际如何工作?

Mar*_*low 5

std::count需要三个参数:两个迭代器和一个要比较的值。因此,它正在尝试将lambda与字符串中的每个字符进行比较。

std::count_if 接受三个参数:两个迭代器和一个“可调用”对象,用于字符串中的每个字符。

正如@ piotr-skotnicki所说,我怀疑您想使用count_if