我正在尝试我自己创建通用函数count_if()
(因此,我不必依赖STL包含<algorithm>
)。
这是我的代码:
template <class InputIterator, class Pred>
int count_if (InputIterator first, InputIterator last, Pred pred) {
int count = 0;
while(first != last ) {
if(pred(*first)) ++count;
++first;
}
return count;
}
我正在尝试将此函数用作谓词:
bool size_more_than_10(std::string val) {
return val.size() > 10;
}
问题:我的谓词适用于std::string
,但是当我取消引用迭代器时,我得到的是char
类型和编译错误:
error: could not convert ‘__it.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator*<char*, std::__cxx11::basic_string<char> >()’ from ‘char’ to ‘std::__cxx11::basic_string<char>’
{ return bool(_M_pred(*__it)); }
这是我的main
(我叫count_if()
):
int main() {
std::string s;
std::getline(std::cin,s);
std::cout<<"count: "<<count_if(s.begin(),s.end(),size_more_than_10);
return 0;
}
我该如何克服这个问题?
答案 0 :(得分:1)
您使用的算法不正确。 您的用法会导致字符迭代,并且谓词接受字符串。
这里是working example:
#include <iostream>
#include <iterator>
template <class InputIterator, class Pred>
int count_if (InputIterator first, InputIterator last, Pred pred) {
int count = 0;
while(first != last ) {
if(pred(*first)) ++count;
++first;
}
return count;
}
bool size_more_than_10(std::string val) {
return val.size() > 10;
}
int main()
{
std::cout << count_if(std::istream_iterator<std::string>(std::cin), {}, size_more_than_10) << '\n';
return 0;
}