#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;
}
上面的程序总是输出向量的第一个数字,而不是在isOdd函数中。我是MacOSX用户,使用g++ odd.cpp
请帮忙
答案 0 :(得分:7)
问题在于以下几点:
vector<int> myVec;
myVec.reserve(20);
std::vector::reserve()
为20个元素保留内存,但不会更改矢量大小。通过std::vector::operator[]
访问这些元素似乎&#34;工作&#34;对你而言,当你访问超出范围的元素时,会导致UB。您可以检查是否用确认索引的std::vector::at()
替换它。
只需将这两行替换为:
vector<int> myVec( 20 );
将创建20个元素等于0的向量。
注意:你的循环不应该使用幻数,应该写成:
for(size_t i = 0; i < myVec.size(); i++)
如果你写得正确,你会立即注意到这个问题。
注2:无法保证您将获得任何奇数,因此您必须验证迭代器,在您取消引用之前由std::find_if
返回。
答案 1 :(得分:0)
由于reserve
已分配所需内存且operator[]
未检查索引范围,因此您没有崩溃。
在您的代码中std::find_if
始终返回myVec.end()
,因为当您仅使用reserved
向量时,向量始终为零且myVec.begin() == myVec.end()
。
你正在引用一个end()
的迭代器,所以它是未定义的行为,但是大多数STL库都会提到保留内存的开头,你在哪里&#34;第一个&#34;价值所在。
因此请reserve
resize
与#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(20);
for(int i = 0; i < myVec.size(); i++)
{
myVec[i] = rand() % 100;
cout << myVec[i] << " ";
}
vector<int>::iterator q = std::find_if(myVec.begin(), myVec.end(), isOdd);
if (q != myVec.end()) {
cout << setw(3) << "first odd = " << *q << endl;
} else {
cout << "Odd values not found!!!\n";
return 1;
}
return 0;
}
或其他答案点一样。
要完全修复您的代码,它应如下所示:
a
答案 2 :(得分:0)
您可以使用push_back
。
vector<int> myVec;
for(int i = 0; i < 20; i++)
{
myVec.push_back(rand() % 100);
cout << myVec[i] << " ";
}
由于Push_back
每次将向量的大小增加1,因此最终大小为20。