Я хочу создать функцию / функтор, который подсчитывает количество букв в векторе строк.
Например:
Выход:
Строки: один два три четыре пять
Письмо: е
Частоты: 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;
};
};
Линия
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
был неиспользован.
Других решений пока нет …