STL向量使用问题 - 函数返回非零迭代器

时间:2010-08-04 10:58:40

标签: c++

我试图使用矢量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()中的非零值。

4 个答案:

答案 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)

您取消引用*它,而不检查它是否在结束之前。您的矢量值都不是奇数,因此它将结束,您将通过解除引用来导致未定义的行为。