我怎样才能利用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函数将返回迭代器,而不是我根本无法弄清楚如何从向量中选择奇数值;(
答案 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;
}
答案 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, " "));