Paulie Gaultieri
Paulie Gaultieri

Reputation: 23

Checking every element of vector with functor

I'm trying to detect whether every single element of the vector is fullfilling given condition, let's say it must even number.

#include <iostream> 
#include <vector> 
#include <algorithm> 

bool isOdd(int i) 
{
    return i%2==0; 
} 

int main() 
{
   int arr[5]={1,2,3,4,5}; 
   std::vector<int> myVec(arr, arr + sizeof(arr)/sizeof(arr[0])); 

   std::vector<int>::iterator it = std::find_if(myVec.begin(), myVec.end(), 
   isOdd()); 

  // This piece of code is probably causing some problems; 

   while(myVec.empty()!=false) // while my vector IS NOT EMPTY 
   {
      std::cout << *it << " "; // print out the value of elements that 
                               // fullfiled the condition given in isOdd
   }                     

   return 0; 
}

What is wrong with my way of thinking ? Is the condition in while loop wrong or maybe I've completely missed the logic ?

Can you please provide me with some complex explanation of what is wrong with this piece of code ?

Thank you in advance.

P.S. I know that there is a possibility to use lambda function instead, but I don't want to get too confused :)

Upvotes: 2

Views: 355

Answers (2)

leemes
leemes

Reputation: 45675

  1. find_if returns the iterator pointing to the first value which meets the given condition. It stops there. You can put this in a loop to find all such elements, until it returns the end iterator.

  2. The following line does the exact opposite of what you meant:

    while(myVec.empty()!=false) // while my vector IS NOT EMPTY 
    

    Either write

    while(myVec.empty()==false)
    

    or

    while(myVec.empty()!=true)
    

    or simpler

    while(!myVec.empty())
    

You could write it as a for-loop:

for (auto it = find_if(begin(myVec), end(myVec), isOdd);
     it != end(myVec);
     it = find_if(it, end(myVec), isOdd))
{
    // do something with "it"
}

Upvotes: 2

Sergey Kalinichenko
Sergey Kalinichenko

Reputation: 726609

The problem with your approach is that you are finding the odd number only once, and then for some reason you expect the vector to change, without making any modifications.

You should make a loop that calls find_if repeatedly, like this:

bool isOdd(int i) {
    return i%2!=0; 
}
... 
std::vector<int>::iterator it = myVec.begin();
for (;;) {
    it = std::find_if(it, myVec.end(), isOdd);
    if (it == myVec.end()) {
        break;
    }
    std::cout << *it << " ";
    ++it;
}

Demo.

Note: I changed your isOdd function to return true for odd numbers. The original version was returning true for even numbers.

Upvotes: 4

Related Questions