STL正确使用find_if()打印出奇数

时间:2014-10-09 16:43:33

标签: c++ stl

我怎样才能利用STL中的find_if算法从向量中查找并打印出奇数。

让我举一个例子来说明我的意思:

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

using namespace std; 


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

int main(void)
{ 
   int tab[]={1,2,3,4,5,6,7,8,9,10}; 
   vector<int> myVec(tab, tab + sizeof(tab)/sizeof(tab[0])); 
   vector<int>::iterator it; 

   //printing out all numbers 

  cout << "Vector contains the following numbers: " << endl; 

  for(it = myVec.begin(), it != myVec.end(), ++it)
  { 
      cout << *it << ' '; 
  } 

 // an unsuccesful attempt to print out odd numbers while using find_if and while loop 

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

 while(bound != myVec.end())
 {
    cout << *bound << ' '; 
 } 


 }

while循环有什么问题,我想这是我代码的核心问题。 我指定任何find_if函数将返回迭代器,而不是我根本无法弄清楚如何从向量中选择奇数值;(

2 个答案:

答案 0 :(得分:3)

问题是你没有在循环中推进迭代器:

while(bound != myVec.end())
{
    cout << *bound << ' '; 
    bound = find_if(bound+1, myVec.end(), isOdd);
}

在C ++ 11中,您可以使用std::next(bound)代替bound+1

此外,当数字为偶数时,您的isOdd会返回true。它应该是

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

Demo.

答案 1 :(得分:3)

只需添加即可,我只需使用std::copy_if

std::copy_if(myVec.begin(), myVec.end(), 
             std::ostream_iterator<int>(std::cout, " "), isOdd);

同样,您的代码中的第一个for循环(以及那些应该是分号,而不是逗号)可以替换为std::copy

std::copy(myVec.begin(), myVec.end(), std::ostream_iterator<int>(std::cout, " "));

Demo