2010-08-04 7 views
1

내가 스피가 다음 샘플 프로그램에서 이상한 반응에 직면 벡터 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; 
} 

스피하기 "에 도달 끝" fun() 함수는 주 프로그램에서 "Not End"로 표시됩니다.

확실치 않은 이유는 무엇입니까? 또한, myvector.end()의 주소가 main 프로그램 [fun() 호출 후], where-as에 나타나서 fun() 함수 내에서 0이 아닌 값을 나타내는 것으로 나타났습니다.

+1

@Roopesh : 질문하는 문제를 해결하기 위해 코드를 편집하지 않는 것이 좋습니다. 더 이상 문제가되지 않습니다. 아니면 변경 후에도 여전히 동일한 문제가 발생합니까? –

+0

나는 정정 된 코드를 실행했습니다. "Reached end"를 메인과 재미로 기록합니다 ... – Vladimir

+0

죄송합니다. 제거하는 것을 잊어 버렸습니다 [ "myvector"의 로컬 인스턴스] ... 로컬을 제거하더라도 myvector의 인스턴스가보고 된 문제를 표시하고 있습니다. –

답변

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

두 개의 서로 다른 myvector의가 있으며, 하나의 세계이며, 다른 하나는 fun입니다. 따라서 전역 벡터에 대한 반복자를 더 이상 존재하지 않는 지역 벡터에 대한 반복자와 비교합니다.

0

myvector이라는 vector의 두 인스턴스가 있습니다. 하나의 전역 및 하나의 로컬은 fun입니다. fun 안에이 로컬 벡터는 글로벌 벡터를 숨 깁니다. 완전히 다른 두 개의 벡터 객체를 조작하고 있으므로 이러한 결과가 나타납니다.

0

끝나기 전에 확인하지 않고 * 역 참조했습니다. 벡터 값 중 어느 것도 홀수가 아니므로 끝나기 때문에 역 참조로 정의되지 않은 동작이 발생합니다.