Как рассчитать «count_if» -STL-функцию строки?

Я хочу создать функцию / функтор, который подсчитывает количество букв в векторе строк.

Например:
Выход:
Строки: один два три четыре пять
Письмо: е
Частоты: 1 0 2 0 1

Я думаю, что мой алгоритм будет работать (я должен решить его с помощью функторов, count_if и for_each), но я не могу поместить решение count_if или for_each / моей функции LetterFrequency в cout-Output.

Я уже пытался с помощью разности типов строки …

Надеюсь, вы можете помочь мне — большое спасибо!

#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
#include "LetterFunctions.h"
using namespace std;

class CompareChar : public unary_function<char, bool>
{
public:
CompareChar(char const s): mSample(s){}

bool operator () (char const a)
{
return (tolower(a) == tolower(mSample));
}

private:
char mSample;
};

class LetterFrequency : public unary_function<string, size_t>
{
public:
LetterFrequency(char const s): mSample(s) {}

size_t operator () (string const& str)
{

return count_if(str.begin(),str.end(),CompareChar(mSample));

}

private:
char mSample;
};

class PrintFrequency : public unary_function<string, void>
{
public:
PrintFrequency(char const s): mSample(s) {}

void operator () (string const& str)
{
string::difference_type i = LetterFrequency(mSample);
cout << i << ", ";
}

private:
char mSample;
};
};

0

Решение

Линия

string::difference_type i = LetterFrequency(mSample);

Создает LetterFrequency объект и пытается присвоить его string::difference_type переменная (которая, вероятно, size_t). Как и следовало ожидать, это не работает, так как между этими типами нет действительного преобразования. Это operator()(const string& str) функция, которая возвращает фактическое количество, а не конструктор, поэтому вам нужно вызвать эту функцию:

LetterFrequency lf(mSample);
string::difference_type i = lf(str);
// Or on one line:
// string::difference_type i = LetterFrequence(mSample)(str);

Кроме того, я рекомендую вам включить предупреждения компилятора ( -Wall флаг в g ++). Это помогло бы предупредить вас о проблеме, предупредив, что параметр str был неиспользован.

1

Другие решения

Других решений пока нет …