Почему std :: count передает константы лямбде, а не символы при работе со строкой? - PullRequest
1 голос
/ 16 марта 2019

У меня есть строка, и я хочу рассчитывать на определенные элементы в ней.Я написал код:

#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;
}

Поскольку std :: count должен возвращать количество элементов, равное другому элементу (указанному в качестве третьего параметра функции) или удовлетворяющее определенной функции, передавая элементы по одному- я ожидаю, что она передаст символы в мою лямбда-функцию.Я писал в основном как в последнем примере на CPPreference , но похоже, что он работает не так, как я ожидаю.Во время компиляции я сталкиваюсь с ошибкой в ​​моей лямбда-функции:

/ bin /../ lib / gcc / x86_64-linux-gnu / 8 /../../../../include / c ++ / 8 / bits / предопределенный_ops.h: 241: 17: ошибка: недопустимые операнды для двоичного выражения ('char' и 'const (лямбда в /home/keddad/CLionProjects/olimp/main.cpp:12:39)') {return * __ it == _M_value;}

Похоже, что count передает некоторую константу моей маленькой функции, которая позже пытается сравнить ее с char (и сбрасывает ошибку).Как я могу заставить мой код работать?Как на самом деле работает std :: count?

1 Ответ

5 голосов
/ 16 марта 2019

std::count принимает три параметра: два итератора и значение для сравнения.Поэтому он пытается сравнить лямбду с каждым символом в строке.

std::count_if принимает три параметра: два итератора и «вызываемый» для вызова каждого символа в строке.

Как сказал @ piotr-skotnicki, я подозреваю, что вы хотите использовать count_if.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...