Take the 2-minute tour ×

The std::basic_string class template has member functions find_first_of and find_first_not_of.

The <algorithm> header, however, contains only a generic find_first_of.

Question1: Is the absence of

std::find_first_not_of(Iter1 first1, Iter1 last1, Iter2 first2, Iter2 last2)

just an oversight (as for example copy_if) or is it intentionally omitted because the behavior can be achieved with another standard function?

Of course I could write my own find_first_not_of, but

Question2: Is there a ready workaround somewhere in <algorithm>? For example, the absence of copy_if is compensated by the presence of remove_copy_if

Thanks in advance

share|improve this question
You know better than to write "thanks", Armen! –  Lightness Races in Orbit Jul 27 '11 at 14:25
@Tomalak: Why does it bother you so much? It's not as if my thanks takes up 50% of my question] –  Armen Tsirunyan Jul 27 '11 at 14:26
Oh, don't you start. –  Lightness Races in Orbit Jul 27 '11 at 14:26
@Tomalak: I've seen your post in meta. I'm not going to roll it back, since you'll call a moderator, but still I am wondering why that bothers you so much :P –  Armen Tsirunyan Jul 27 '11 at 14:28
I have never thought about it, but this answer clarifies a few things: meta.stackoverflow.com/questions/98149/… –  karlphillip Jul 27 '11 at 19:14
show 1 more comment

4 Answers

I had this same problem, the short answer to your question: it's not possible with the standard stl libraries (although it is possible with boost::phoenix).

However, you can write your own closure surrounding the sequence iterators that accepts a parameterized 'Value' variable and returns a bool result.

 template<class Iterator> struct is_not_in_range
    Iterator const begin;
    Iterator const end;
is_not_in_range(Iterator const& b, Iterator const& e)
    :   begin(b)
    ,   end(e) {}
    template<class Value> bool operator()(Value & v)
          return std::find(begin,end,v) == end;

Then you can do this

std::find_if(begin1, end1,  is_not_in_range<Iterator2>(begin2,end2));

Alternatively, you can write a version that uses less branching, but requires a break->continue (approximated with a goto statement)

template<class Iterator1, class Iterator2> Iterator1 find_first_not_of
(   Iterator1 const& begin1
,   Iterator1 const& end1
,   Iterator2 const& begin2
,   Iterator2 const& end2 )
    for(Iterator1 mid1 = begin1; mid1 != end1; ++mid1)
        for(Iterator2 mid2 = begin2; mid2 != end2; ++mid2)
            if(*mid1 == *mid2)
                goto FOUND;
        return mid1;
FOUND:      ;
    return end1;
share|improve this answer
add comment

It's easy to write one:

pos = std::find(search_list.begin()...)
if (pos!= npos)
   pos = std::find(black_list.begin()...)
   if (pos!= npos)
       continue search
      found !!
   not found
share|improve this answer
I know it's easy to write one, thank you. But my question is a bit different :) –  Armen Tsirunyan Jul 27 '11 at 14:21
well ... it is simulated using 2 std:find calls :) Maybe can be simulated by using other calls but will be something similar. –  cprogrammer Jul 27 '11 at 14:27
add comment

I'm not sure about your first question but I think the best you can do is find_if:

template <class Iter>
class Check
    Check(Iter first, Iter last) : first_(first), last_(last) { }
    template <class T>
    bool operator()(const T& item) { return std::find(first, last, item) == last; }
    Iter first_;
    Iter last_;

find_if(first1, last1, Check<Iter2>(first2, last2));
share|improve this answer
I think I would write my own find_first_not_of with less characters than this. :) –  Armen Tsirunyan Jul 27 '11 at 13:59
@Armen: Fewer :) –  Lightness Races in Orbit Jul 27 '11 at 14:24
@Tomalak: It's a pity you cannot edit others' comments, isn't it? :))) –  Armen Tsirunyan Jul 27 '11 at 14:25
add comment

There are new functions added in latest STL (Jump to).

all_of, any_of, none_of, find_if_not, copy_if etc.

share|improve this answer
find_if_not and find_first_not_of are completely different –  Armen Tsirunyan Jul 27 '11 at 13:26
My reply should be considered as work around! :) –  Ajay Jul 27 '11 at 13:28
How would you use find_if_not to achieve what find_first_not_of is supposed to be for? And also, that is all about C++0x, what about doing it in C++03? –  Armen Tsirunyan Jul 27 '11 at 13:29
@Ajay: Armen Tsirunyan considered it as a workaround and found yours flawed (reason indicated by his comment). –  nightcracker Jul 27 '11 at 13:29
@Armen: OK, then new functions in TR1 are no help even if they did the job. And I think there's a semi-colon missing in my code, should be });});! –  Steve Jessop Jul 27 '11 at 13:33
show 8 more comments

Your Answer


