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

Checking every element of vector with 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 函数,但我不想搞得太糊涂 :)

  1. find_if returns 指向满足给定条件的第一个值的迭代器。它停在那里。你可以把它放在一个循环中寻找 all 这样的元素,直到它 returns 结束 迭代器.

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

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

    要么写

    while(myVec.empty()==false)
    

    while(myVec.empty()!=true)
    

    或更简单

    while(!myVec.empty())
    

您可以将其写成 for 循环:

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

你的方法的问题是你只找到奇数一次,然后出于某种原因你希望向量发生变化,而不做任何修改。

你应该创建一个重复调用 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 函数更改为 return true。原始版本是 returning true 偶数。