count_if实现-C ++

时间:2018-09-04 14:02:09

标签: c++ string algorithm templates

我正在尝试我自己创建通用函数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;
}

我该如何克服这个问题?

1 个答案:

答案 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;
}