-
c++ iterator에서 vector 요소를 삭제하기 및 주의점IT/C C++ 2023. 6. 17. 16:25반응형
아래와 같은 말도 안 되는 벡터가 있다고 가정해 보자.
뭔가 잘못된 문자가 껴 있는 거 같아서 iterator를 돌려서 특정 문자를 삭제해보려고 한다.
위처럼 iterator를 돌려서 특정 조건에 해당하는 요소를 erase 함수로 지울 수 있다.
그런데 이것은 틀렸습니다!!
위 코드를 돌려보면 애석하게도 결과는 아래와 같이 나온다.
해당 iterator의 요소를 erase 함수로 삭제해 버리면 해당 it 값은 사라져 버리고 erase 함수는 삭제에 성공하면 그다음 위치의 iterator 위치를 반환하기 때문에 위처럼 코드를 작성하면 모든 vector를 순회하지 못하기 때문이다.
위 코드처럼 조건에 맞는 erase 가 호출되었을 때 it의 위치를 erase가 반환해 주는 포지션 (삭제된 it의 다음 위치)으로 갱신해야 한다.
또한 for문에서 it 값을 증가시키지 않고 조건에 맞지 않았을 때 it를 증가시켜 줘야 모든 vector를 순회할 수 있다.
#include <iostream> #include <vector> int main(int argc, const char * argv[]) { std::vector<int> intVector; intVector.push_back(10); intVector.push_back(100); intVector.push_back(1000); intVector.push_back(2000); intVector.push_back(3000); intVector.push_back(4000); for(auto it = intVector.begin(); it != intVector.end();) // it 증감 조건 없어야함 { auto element = *it; if(element > 1000) it = intVector.erase(it); // erase it 는 삭제되고 erase에서 다음 칸을 반환 else it++; // 못찾았으면 it 포지션 증가 } for(auto it = intVector.begin(); it != intVector.end(); it++) std::cout << *it << std::endl; return 0; }
코드 블럭은 좀 더 이쁜 예제로~
반응형'IT > C C++' 카테고리의 다른 글
C++ 스마트 포인터 [unique_ptr , shared_ptr, weak_ptr] (0) 2023.06.15