Я пытался использовать векторный 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 () обнаруживается как Нуль в основной программе [после забавы () вызов], тогда как, показывая ненулевое значение в функциональной забаве ().
Функция использует локальный вектор 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;
}
Есть два разных myvector
s, один глобальный, другой в fun
. Следовательно, вы сравниваете итератор с глобальным вектором, а итератор с локальным вектором, которого, к тому же, больше не существует.
У вас есть два экземпляра vector
с именем myvector
. Один глобальный и один локальный для функции fun
. Внутри fun
этот локальный вектор скрывает глобальный вектор. Поскольку вы оперируете двумя совершенно разными векторными объектами, вы видите такие результаты.
Вы разыменовали *it, не проверив, находится ли он перед end. Ни одно из ваших векторных значений не является нечетным, поэтому оно будет end, и вы вызовете неопределенное поведение, разыменовав его.