【问题标题】:Checking every element of vector with functor用函子检查向量的每个元素
【发布时间】:2015-02-20 00:50:10
【问题描述】:

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

#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 只返回满足条件的第一个迭代器
  • 如果您使用的是 C++11,并且您不想打印出奇数,那么可以使用带有谓词的 std::all_of

标签: c++ vector functor


【解决方案1】:

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

你应该循环调用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 用于偶数。

【讨论】:

    【解决方案2】:
    1. find_if 返回指向满足给定条件的第一个值的迭代器。它停在那里。您可以将其放入循环中以查找 all 此类元素,直到它返回 end 迭代器

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

    【讨论】:

    • 谢谢你的解释,现在我知道问题出在哪里了,但我想知道我是否可以坚持 while 循环,我是否应该只通过添加行 'it++' 来修改它结束了吗?
    • 无论如何这都行不通。您的 while 循环条件与迭代器的状态无关,如果向量在循环开始时不为空,则该条件在执行时永远不会改变。 N 迭代后,你的迭代器会失效,你的程序最终会崩溃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    相关资源
    最近更新 更多