2016-08-26 2 views
3

을 삭제하는 동안 (unordered_set 같이) STL의 모든 요소를 ​​통과하는 방법 : 그러니까 기본적으로내가 예제 코드를 작성했습니다 그들에게

void eg(){ 
    unordered_set<int> s; 
    s.insert(1); 
    s.insert(4); 
    s.insert(3); 
    s.insert(6); 
    auto ite = s.begin(); 
    while(ite != s.end()){ 
    int num = *ite; 
    cout << num << endl; 
    while(s.find(num+1) != s.end()){ 
     s.erase(s.find(num)); 
     num++; 
    } 
    while(s.find(num-1) != s.end()){ 
     s.erase(s.find(num)); 
     num--; 
    } 
    auto tmp = ite; 
    ite ++; 
    s.erase(tmp); 
    } 
} 

를이 세트를 생성하고 추가 {1,3,4,6-} 그 안에. 집합을 가로 지르고 요소를 인쇄하면 인쇄 후에 집합의 모든 연속 요소가 삭제됩니다.

그래서 코드는 1, x (다른 하나가 지워지기 때문에 3과 4 중 하나)와 같은 것을 인쇄합니다.

하지만 실행 후 3과 세그먼테이션 오류가 발생했습니다. 요소를 지우는 동시에 반복기를 유효하게 유지할 수 있습니까?

나는 영어 실력을 향상시키고있다.

도움 주셔서 감사합니다.

+0

'num '이 3 일 때'ite'는 가리키는 요소를 지웠기 때문에'auto tmp = ite; '에 도달했을 때 이미 무효화되어 있습니다 ... –

답변

1

삭제 returns 지난 제거 된 요소 다음의 반복자, 그래서 그냥 코드에서 사방

ite = s.erase(.....); 

s.erase(.....); 

를 교체합니다.

1

std::set::erase이 반환 한 반복자를 사용하십시오.

ite = s.erase(...); 
관련 문제