用函子检验向量的每个元素

Checking every element of vector with functor

本文关键字:元素 向量 检验      更新时间:2023-10-16

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

#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循环中的条件是错误的,还是我完全错过了逻辑?

你能为我提供一些关于这段代码出了什么问题的复杂解释吗?

提前谢谢。

附言:我知道有可能使用lambda函数,但我不想太混淆:)

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

您应该创建一个循环,重复调用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;
}

演示。

注意:我更改了isOdd函数,为奇数返回true。原始版本返回的是偶数的true

  1. find_if返回迭代器,该迭代器指向满足给定条件的第一个值。它就停在那里。您可以将其放入一个循环中,以查找所有这样的元素,直到它返回结束迭代器

  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"
}