用函子检验向量的每个元素
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循环中的条件是错误的,还是我完全错过了逻辑?
你能为我提供一些关于这段代码出了什么问题的复杂解释吗?
提前谢谢。
附言:我知道有可能使用lambda函数,但我不想太混淆:)
您的方法的问题是,您只找到奇数一次,然后出于某种原因,您希望向量发生变化,而不进行任何修改。
您应该创建一个循环,重复调用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
。
-
find_if
返回迭代器,该迭代器指向满足给定条件的第一个值。它就停在那里。您可以将其放入一个循环中,以查找所有这样的元素,直到它返回结束迭代器。 -
下面的行与您的意思完全相反:
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"
}
相关文章:
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- C++:如何循环通过向量中的整数元素
- 如何在C++向量中奇数元素前面加上值-1,我在使用insert函数时遇到了问题
- 不允许在向量中添加更多元素
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 使用并行参数向量调用元素向量的成员函数
- C++ 查找字符串中存在的元素向量
- 包含 std::threads 的元素向量
- 避免从单一元素向量转换为基元类型
- 对自定义元素向量进行排序时出现意外(至少对我来说)行为
- 如何为对元素(向量和int)配对创建unique_ptr也是unique_ptr
- 元素向量乘法 C++(代码不起作用)
- 时间和空间复杂性在二叉树的每个级别创建元素向量(NON-BST)
- 遍历结构元素向量
- 犰狳C++中的元素向量或矩阵乘法
- 为什么'std::vector<int> b{2};'创建 1 元素向量,而不是 2 元素向量?
- 可移动元素向量的大小调整是否有效?
- 唯一元素向量的c++模板函数
- 获取索引和元素-向量问题
- 定义一个生成元素向量的函数时,正确的方法是什么?