gpt4 book ai didi

c++ - find_if 总是给出第一个元素而不进入 isOdd 函数

转载 作者:太空宇宙 更新时间:2023-11-03 10:39:15 24 4
gpt4 key购买 nike

#include <iostream>
#include <vector>
#include <algorithm>
#include <time.h>
#include <iomanip>

using namespace std;

bool isOdd(int n)
{
cout << "HELLO";
bool val = ((n%2) == 1);
cout << val << endl;
return val;
}

int main()
{
srand(time(NULL));

vector<int> myVec;
myVec.reserve(20);

for(int i = 0; i < 20; i++)
{
myVec[i] = rand() % 100;
cout << myVec[i] << " ";
}

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

cout << setw(3) << "first odd = " << *q << endl;

}

上面的程序总是输出 vector 的第一个数字,而不是在 isOdd 函数中。我正在使用 MacOSX 并使用 g++ odd.cpp

编译程序

请帮忙

最佳答案

问题出在这些行中:

 vector<int> myVec;
myVec.reserve(20);

std::vector::reserve() 为 20 个元素保留内存,但不改变 vector 大小。通过 std::vector::operator[] 访问这些元素似乎对您“有效”,但当您访问超出范围的元素时会导致 UB。您可以检查是否将其替换为验证索引的 std::vector::at()

只需将这两行替换为:

vector<int> myVec( 20 );

这将创建包含 20 个元素等于 0 的 vector 。

注意:你的循环不应该使用魔数(Magic Number),应该写成:

for(size_t i = 0; i < myVec.size(); i++)

如果你写得正确,你会立即注意到这个问题。

注意 2:无法保证您会得到任何奇数,因此您必须在取消引用之前验证 std::find_if 返回的迭代器。

关于c++ - find_if 总是给出第一个元素而不进入 isOdd 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47817979/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com