2017-01-03 9 views
0

에 삭제 (반복자를) 일에 관찰 간단한 std::vector다른 동작 벡터와지도

std::vector<int> integers; 
integers.push_back(10); 
integers.push_back(11);  
cout << "Before: " << integers.size(); //prints 2 

I 각 요소 하나의 C++ 5.1 및 C++ (14)을 삭제하는 코드의 3 가지 버전을 사용하여 시도

버전 1 :

for(std::vector<int>::iterator it = integers.begin() ; it != integers.end() ;) 
{ 
    cout << "\nVal: " << *it; 
    it = integers.erase(it); 
} 

cout << "\nAfter: " << integers.size(); 

출력 [Expected]

,745 C
Before: 2 
Val: 10 
Val: 11 
After: 0 

버전 2 :

for(std::vector<int>::iterator it1, it = integers.begin() ; it != integers.end() ;) 
{ 
    cout << "\nVal: " << *it; 
    it1 = std::next(it); 
    integers.erase(it); 
    it = it1; 
} 

출력 : [예기치 않은]

Before: 2 
Val: 10 
After: 1 

동안 std::map를 들어, 버전 2 일 예상대로 :

int main() { 
    std::map<int, int> m; 
    m.insert(make_pair(10, 11)); 
    m.insert(make_pair(12, 13)); 
    cout << "Before: " << m.size(); 

    for(std::map<int, int>::iterator it1, it = m.begin() ; it != m.end() ;) 
    { 
     cout << "\nVal: " << it->first << ", " << it->second; 
     it1 = std::next(it); 
     m.erase(it); 
     it = it1; 
    } 
    cout << "\nAfter: " << m.size(); 
    return 0; 
} 

출력 :

Before: 2 
Val: 10, 11 
Val: 12, 13 
After: 0 

심지어이 작품 :

for(std::map<int, int>::iterator it1, it = m.begin() ; it != m.end() ;) 
{ 
    cout << "\nVal: " << it->first << ", " << it->second; 
    m.erase(it++); 
} 

왜 버전의 표준 : :지도가 아닌 표준 : : 벡터에 2 개 작품?

+1

'map <> :: erase (it)'와'vector <> :: erase (it) '는 결과 반복자에서 동일한 동작을 나타내야한다는 표준이 있습니까? 제가 알고있는 유일한 것은 첫 번째 버전이 일반적인 방법으로 작동한다는 것입니다. –

+0

'map :: erase'는 버전 1을 지원하지 않습니다. 그렇습니다. 그렇다고 표준화되어 있지는 않지만 개발자의 관점에서 볼 때'version 2'를'vector'와 함께 사용하는 중에 실수로 쉽게 실수 할 수 있습니다. –

+0

방금'it = m.erase (it); '를 사용하고'it1'을 사용하지 않고'After : 0'을 받았습니다. –

답변

1

차는 std::vector 반복자 동안 연관 컨테이너 (23.2.4 연관 컨테이너)

9 인서트 요소들을 소거 후에 무효화 부재를 설치하다된다는 것이다하여야한다 아닌 FF 요법 반복자 참고 문헌의 유효성 지우기 구성원 은 지우는 사람 요소에 대한 반복기 및 참조 만 무효화해야합니다.

+0

예 코멘트 섹션 http://stackoverflow.com/a/263958/1465553에 있습니다. @Loki 님이 제공 한 것입니다. 그러나 나는 그것이 왜 그런 식으로 결정되었는지 확신 할 수 없다. 그럴만 한 이유가 있습니다. –

+1

@SauravSahu 벡터에서 지운 요소 후의 요소는 한 위치 왼쪽으로 이동합니다. –

+0

좋아 ... 그 이유는 정말 의미가 있습니다. –