我试图使用矢量STL,其中iam面临来自以下示例程序的奇怪响应:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<int>::iterator fun();
vector<int> myvector;
bool IsOdd (int i) {
return ((i%2)==1);
}
int main()
{
vector<int>::iterator it;
it = fun();
if (it == myvector.end() )
cout << "Reached end, Global" << endl;
else
cout << "Not end" << endl;
}
vector<int>::iterator fun() {
vector<int>::iterator it;
myvector.push_back(10);
myvector.push_back(26);
myvector.push_back(40);
myvector.push_back(56);
it = find_if (myvector.begin(), myvector.end(), IsOdd);
cout << "The first odd value is " << *it << endl;
if (it == myvector.end() )
cout << "Reached end, inside the function" << endl;
else
cout << "Not end" << endl;
return it;
}
我在函数fun()中得到“Reached End”,而在主程序中,它显示为“Not End”。
不确定,可能是什么原因。另外,发现myvector.end()的地址在主程序中显示为零[在fun()调用之后],其中-as显示函数fun()中的非零值。
答案 0 :(得分:2)
该函数正在使用本地myvector,main正在使用全局myvector。
您修改后的代码会生成:
Reached end, inside the function
Reached end, Global
正如所料。
编辑:嗯,不像预期的那样 - 正如其他人指出的那样:
it = find_if (myvector.begin(), myvector.end(), IsOdd);
cout << "The first odd value is " << *it << endl;
将导致数据集的未定义行为,因为您没有任何奇数值。你想要:
it = find_if (myvector.begin(), myvector.end(), IsOdd);
if ( it != myvector.end() ) {
cout << "The first odd value is " << *it << endl;
}
答案 1 :(得分:0)
有两个不同的myvector
,一个是全局的,另一个是fun
。因此,您将迭代器与全局向量进行比较,并将迭代器与本地向量进行比较,而本地向量此外不再存在。
答案 2 :(得分:0)
您有两个名为vector
的{{1}}个实例。一个全局函数和一个函数myvector
。在fun
内,此局部向量隐藏了全局向量。由于您正在使用两个完全不同的矢量对象,因此您会看到这些结果。
答案 3 :(得分:0)
您取消引用*它,而不检查它是否在结束之前。您的矢量值都不是奇数,因此它将结束,您将通过解除引用来导致未定义的行为。