2013-03-29 3 views
3

내가 잘못 된 부분을 알아낼 수 없습니다. 내가 알기로이 코드는 "1, 2, 3"을 반환해야하지만 다음과 같은 결과를 얻습니다. 필자는 벡터와 iterator를 전역 적으로 선언해야한다. 왜냐하면 필자는 vector를 실제 코드의 함수에 전달하고 일부 함수에서 iterator를 업데이트해야하기 때문이다. 어떤 도움을 주셔서 감사합니다!반복자가 가비지를 반환합니다.

#include <iostream> 
#include <vector> 

using namespace std; 

vector<float> grid; 
vector<float>::iterator gridPtr; 

int main() 

{ 
    grid.push_back(1); 
    grid.push_back(2); 

    gridPtr = grid.begin(); 

    grid.push_back(3); 

    cout << "gridPtr: " << *gridPtr << endl; 

    gridPtr++; 

    cout << "gridPtr: " << *gridPtr << endl; 

    gridPtr++; 

    cout << "gridPtr: " << *gridPtr << endl; 
} 

이 반환

gridPtr: 2.62257e-33 
gridPtr: 2 
gridPtr: 0 
+0

* "나는의 함수 벡터를 통과하고 있기 때문에 : 손 전에-또한 문제를 해결하기위한 충분한 메모리를 할당 할 reserve를 사용하여,

grid.push_back(1); grid.push_back(2); gridPtr = grid.begin(); cout << "gridPtr: " << *gridPtr << endl; gridPtr++; cout << "gridPtr: " << *gridPtr << endl; 

케빈이 언급 한 바와 같이 : 다음은 예상대로 작동합니다 내 실제 코드 "* - 함수에 전달하는 경우 전역에 있어야하는 이유는 무엇입니까? 그것은 모순 된 것처럼 보인다. – JBentley

+0

JBentley - 저의 실수는, 저는 그것들을 함수에서 사용하고 있고 그것을 전달하고 싶지 않다는 것을 의미했습니다. 반복기 무효화에 대한 설명은 – bcf

+0

[이 답변보기] (http://stackoverflow.com/a/6438087/1227469)을 참조하십시오. – JBentley

답변

4

push_back() 모든 반복자를 무효화 될 수 있습니다. 즉, 배킹 스토어를 재 할당해야한다면 기존의 모든 반복자가 무효화됩니다.

미리 푸시 할 요소의 수를 알고있는 경우 reserve()을 사용하여 필요한 메모리를 미리 할당하면 push_back()이 다시 할당되지 않으므로 이터레이터가 무효화되지 않습니다. http://en.cppreference.com/w/cpp/container/vector/push_back에서

2

:

새로운 size()capacity()보다 큰 경우, 모든 반복자 및 참조는 무효화됩니다. 당신은 후드 아래에 무슨 일이 일어나고 있는지 고려할 때

. (강조 광산)

이 의미가 있습니다; vector은 동적으로 할당 된 배열을 채워서 작동합니다. 그것이 가득 차면 더 큰 것을 재 할당해야하고 모든 것을 가로 질러 움직여야합니다.

1

push_back을 수행 할 때 iterator을 무효화 할 수 있습니다. 해당 행을 삭제하면 정상적으로 작동합니다.

grid.reserve(3) ; 
grid.push_back(1); 
grid.push_back(2); 

gridPtr = grid.begin(); 

grid.push_back(3) ; 
cout << "gridPtr: " << *gridPtr << endl; 
gridPtr++; 
cout << "gridPtr: " << *gridPtr << endl; 
gridPtr++; 
cout << "gridPtr: " << *gridPtr << endl; 
관련 문제