#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;
}
Run Code Online (Sandbox Code Playgroud)
上面的程序总是输出向量的第一个数字,而不是在isOdd函数中.我是MacOSX用户并使用编译程序g++ odd.cpp
请帮忙
问题在于以下几点:
vector<int> myVec;
myVec.reserve(20);
Run Code Online (Sandbox Code Playgroud)
std::vector::reserve()为20个元素保留内存,但不改变矢量大小.通过访问这些元素std::vector::operator[]似乎"工作"给你,但当你访问超出范围的元素时导致UB.您可以检查是否用std::vector::at()确认索引替换它.
只需将这两行替换为:
vector<int> myVec( 20 );
Run Code Online (Sandbox Code Playgroud)
这将创建20个元素等于0的向量.
注意:你的循环不应该使用幻数,应该写成:
for(size_t i = 0; i < myVec.size(); i++)
Run Code Online (Sandbox Code Playgroud)
如果你写的正确,你会立即注意到这个问题.
注2:不能保证你会得到任何奇数,所以你必须验证迭代器,std::find_if在你取消引用它之前返回.
| 归档时间: |
|
| 查看次数: |
71 次 |
| 最近记录: |