5월 27일

RushBsite·2021년 5월 27일
0

TIL

목록 보기
5/18
post-thumbnail

벡터 순차 탐색중 erase


std::erase 함수는 해당 인덱스의 데이터를 지우고 그 뒤에 있는 데이터를 남은 자리만큼 앞으로 이동시킨다.

따라서 순차적으로 벡터 탐색시 인덱스를 기반으로 erase 하면 문제가 생기는데, erase함수로 벡터의 사이즈와 인덱스가 줄어들어, 초기 i값의 탐색 범위와 괴리가 생기기 때문이다.

vector<int> v = {1,2,3,4,5};

for(int i=0;i<v.size();i++){
	if(i==2) v.erase(v.begin()+i) // v의 i번째 요소를 지움 (v[2] == 3)
}                                     // 따라서 이 시점 이후로 v.size = 4, v ={1,2,4,5}
                                      // 즉, for루프문을 4번만 돈다.

따라서 이를 해결하려면 루프문의 증감식을 사용하지 말고, 반복문 내부에서 조건적으로 증감해준다.

인덱스 기반 탐색중 erase

일반적인 인덱스 기반의 반복 루프문으로 벡터 접근시, erase 하지 않았을 경우에만 인덱스를 증가시킨다.

vector<int>v;
  for(int i=0; i<v.size(); ) {
   if(erase 할 조건) {
       v.erase(v.begin()+i);                    
   }
   else i++; // erase 안한경우에만 인덱스 증가
   }

반복자 기반 탐색중 erase

erase 는 삭제에 성공할시, 삭제한 요소의 바로 다음 iterator를 반환하기 때문에 이 값을 바로 대입시켜준다.

vector<int>v;
vector<int>::iterator it;
  for(it v.begin(); i!=v.end(); ) {
   if(erase 할 조건) {
      it = v.erase(it);                    
   }
   else it++; // erase 안한경우에만 인덱스 증가
   }
profile
게임 기획/개발 지망생

0개의 댓글