用仿函数检查向量的每个元素

时间:2015-02-20 00:50:11

标签: c++ vector functor

我试图检测向量的每个元素是否满足给定条件,假设它必须是偶数。

#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; 
}

我的思维方式出了什么问题? while循环中的条件是错误的还是我完全错过了逻辑?

您能否向我提供一些复杂的解释,说明这段代码有什么问题?

提前谢谢你。

P.S。我知道有可能使用lambda函数,但我不想太困惑:)

2 个答案:

答案 0 :(得分:4)

你的方法的问题是你只发现一次奇数,然后由于某种原因你期望矢量改变,而不做任何修改。

你应该重复调用find_if的循环,如下所示:

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.

注意:我更改了isOdd函数,以便为奇数返回true。对于偶数,原始版本返回true

答案 1 :(得分:2)

  1. find_if返回指向满足给定条件的第一个值的迭代器。它停在那里。你可以把它放在循环中找到所有这样的元素,直到它返回 end iterator

  2. 以下行与您的意思完全相反:

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

    while(myVec.empty()==false)
    

    while(myVec.empty()!=true)
    

    或更简单

    while(!myVec.empty())
    
  3. 你可以把它写成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"
    }