Why find_if not working in my program?

c++, syntax

Solution

You pass `i` which is of type `std::string::const_iterator`(and also uninitialized) as first parameter to `std::find_if`. Then you pass `s.end()` which returns a `std::string::iterator`. The two iterators are of different types, while `std::find_if` expects them to be of the same type.

The correct rule of thumb, is to pair the calls to `begin()` and `end()`

#include <string>
#include <cctype>
#include <algorithm>

bool notspace(char ch);
bool space(char ch);

int main()  {
    typedef std::string::const_iterator iter;
    iter i,j;
    std::string s = "ab c";
    i = std::find_if(s.begin(), s.end(),notspace);
    j = std::find_if(s.begin(), s.end(),space);
    return 0;
}

bool space(char ch)  {
    return std::isspace(ch);
}

bool notspace(char ch)   {
    return !std::isspace(ch);
}

Problem

I have a simple program that calls `std::find_if`, I think I've pass the first two argument as iterator and the third as a predict, however the code still won't compile, any ideas? ``` #include <string> #include <cctype> #include <algorithm> bool notspace(char ch); bool space(char ch); int main() { typedef std::string::const_iterator iter; iter i; std::string s = "ab c"; i = std::find_if(i, s.end(),space); return 0; } bool space(char ch) { return std::isspace(ch); } ``` Error message: ``` q-isspace.cpp: In function ‘int main()’: q-isspace.cpp:12:38: error: no matching function for call to ‘find_if(iter&, std::__cxx11::basic_string<char>::iterator, bool (&)(char))’ i = std::find_if(i, s.end(),space); ^ In file included from /usr/include/c++/5/algorithm:62:0, from q-isspace.cpp:3: /usr/include/c++/5/bits/stl_algo.h:3806:5: note: candidate: template<class _IIter, class _Predicate> _IIter std::find_if(_IIter, _IIter, _Predicate) find_if(_InputIterator __first, _InputIterator __last, ^ /usr/include/c++/5/bits/stl_algo.h:3806:5: note: template argument deduction/substitution failed: q-isspace.cpp:12:38: note: deduced conflicting types for parameter ‘_IIter’ (‘__gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> >’ and ‘__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >’) i = std::find_if(i, s.end(),space); ```

Original source