我试图检测向量的每个元素是否满足给定条件,假设它必须是偶数。
#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函数,但我不想太困惑:)
答案 0 :(得分:4)
你的方法的问题是你只发现一次奇数,然后由于某种原因你期望矢量改变,而不做任何修改。
你应该重复调用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 :(得分:2)
find_if
返回指向满足给定条件的第一个值的迭代器。它停在那里。你可以把它放在循环中找到所有这样的元素,直到它返回 end iterator 。
以下行与您的意思完全相反:
while(myVec.empty()!=false) // while my vector IS NOT EMPTY
写
while(myVec.empty()==false)
或
while(myVec.empty()!=true)
或更简单
while(!myVec.empty())
你可以把它写成for-loop:
for (auto it = find_if(begin(myVec), end(myVec), isOdd);
it != end(myVec);
it = find_if(it, end(myVec), isOdd))
{
// do something with "it"
}