Проблема использования вектора STL — Функция, возвращая ненулевой Итератор

Я пытался использовать векторный STL, где я сталкиваюсь со странным ответом из следующего примера программы:

#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;
}

Я получаю "Достигнутый Конец" в функциональной забаве (), тогда как в основной программе это обнаруживается как "Не Конец".

Не уверенный, какова могла бы быть причина. Кроме того, нашел, что, Адрес myvector.end () обнаруживается как Нуль в основной программе [после забавы () вызов], тогда как, показывая ненулевое значение в функциональной забаве ().

1
задан Roopesh Majeti 4 August 2010 в 11:05
поделиться

4 ответа

Функция использует локальный вектор myvector, main - глобальный.

Ваш измененный код производит:

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;
}
2
ответ дан 2 September 2019 в 22:27
поделиться

Есть два разных myvector s, один глобальный, другой в fun . Следовательно, вы сравниваете итератор с глобальным вектором, а итератор с локальным вектором, которого, к тому же, больше не существует.

0
ответ дан 2 September 2019 в 22:27
поделиться

У вас есть два экземпляра vector с именем myvector. Один глобальный и один локальный для функции fun. Внутри fun этот локальный вектор скрывает глобальный вектор. Поскольку вы оперируете двумя совершенно разными векторными объектами, вы видите такие результаты.

0
ответ дан 2 September 2019 в 22:27
поделиться

Вы разыменовали *it, не проверив, находится ли он перед end. Ни одно из ваших векторных значений не является нечетным, поэтому оно будет end, и вы вызовете неопределенное поведение, разыменовав его.

0
ответ дан 2 September 2019 в 22:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: