2013-06-27 6 views
0

std::vector 반복자를 포인터로 구현할 수 있습니다. 결론적으로 벡터에 요소를 추가하면 일반적으로 벡터 데이터를 재 할당해야하기 때문에 뛰어난 반복기가 분명히 무효화됩니다.유효하지 않은 벡터 반복자

정확한 규칙에 대한 첫 번째 추측은 허용 된 연산이 포인터의 연산과 정확히 동일하다는 것입니다. 유효한 값을 다시 할당 할 때까지 유효하지 않은 반복기를 역 참조하지 마십시오. 그러나 디버그 모드에서의 Microsoft 구현은 예를 들어 예외가 발생하기 때문에 사실이 아닌 것처럼 보입니다. (디버깅에 도움이되는) 다른 데이터 블록을 가리키는 벡터 반복자를 뺍니다.

포인터에 대한 부록은 '반복자를 다른 데이터 블록으로 빼지 않습니까?'또는 '유효한 값을 다시 할당 할 때까지 유효하지 않은 반복자에 대해 산술 연산을 수행하지 않습니까?'등과 같은 규칙입니까?

예를 들어 다음 프로그램 (Microsoft C++과 GCC에서 모두 작동하는 것 같습니다)이 유효합니까?

#include <algorithm> 
#include <iostream> 
#include <vector> 

using std::cout; 
using std::ostream; 
using std::vector; 

template<class T> ostream& operator<<(ostream& os, vector<T>& v) { 
    os << '['; 
    bool c = 0; 
    for (auto a: v) { 
     if (c) 
      os << ", "; 
     c = 1; 
     os << a; 
    } 
    return os << ']'; 
} 

void f(vector<int>& v, vector<int>::iterator& i) { 
    *i = 10; 
    for (int j = 0; j < 10; j++) 
     v.insert(begin(v), j); 
    i = begin(v)+5; 
} 

int main() { 
    vector<int> v; 
    for (int i = 0; i < 10; i++) 
     v.push_back(i); 
    auto i = begin(v)+5; 
    f(v, i); 
    i[1] = 11; 
    cout << v << '\n'; 
    return 0; 
} 
+0

"다른 데이터 블록을 가리키는 반복자"가 정확히 무엇을 의미합니까? – jogojapan

+0

그리고 예제 프로그램이 유효하지 않은 이유는 무엇입니까? 어떤 시점에서 유효하지 않다고 생각되는 일이 발생합니까? – jogojapan

+0

@jogojapan 다른 벡터 또는 새 요소를 추가하기 전과 후에 같은 벡터의 요소가 재 할당을 초래했습니다. – rwallace

답변

-1

귀하의 예가 유효하지 않은 이유는 운이 좋았 기 때문입니다. 벡터에서 재 할당을 일으킬 수있는 모든 연산은 모든 반복기를 무효화 할 수 있습니다.

+0

구체적으로 언급 한 코드의 부분을 설명해 주시겠습니까? 또한 이터레이터를 무효로한다고해서 프로그램이 유효하지 않다는 것을 의미하는 것은 아닙니다. 그것은 당신이 반복자로해서는 안되는 어떤 것들이 있다는 것을 의미합니다. – jogojapan