用仿函数检查向量的每个元素
Checking every element of vector with functor
我正在尝试检测向量的每个元素是否都满足给定条件,假设它必须是偶数。
#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 函数,但我不想搞得太糊涂 :)
find_if
returns 指向满足给定条件的第一个值的迭代器。它停在那里。你可以把它放在一个循环中寻找 all 这样的元素,直到它 returns 结束 迭代器.
下一行与您的意思完全相反:
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"
}
你的方法的问题是你只找到奇数一次,然后出于某种原因你希望向量发生变化,而不做任何修改。
你应该创建一个重复调用 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
函数更改为 return true
。原始版本是 returning true
偶数。
我正在尝试检测向量的每个元素是否都满足给定条件,假设它必须是偶数。
#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 函数,但我不想搞得太糊涂 :)
find_if
returns 指向满足给定条件的第一个值的迭代器。它停在那里。你可以把它放在一个循环中寻找 all 这样的元素,直到它 returns 结束 迭代器.下一行与您的意思完全相反:
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"
}
你的方法的问题是你只找到奇数一次,然后出于某种原因你希望向量发生变化,而不做任何修改。
你应该创建一个重复调用 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
函数更改为 return true
。原始版本是 returning true
偶数。