728x90
반응형

vector의 값을 반복문을 통해 값을 출력할 때 주의할 점이 있다.

iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);

 

설명하기 전에 erase 함수에 대해 간단하게 설명하자면

iterator erase (const_iterator position); 

 

const_iterator 타입의 position 은 제거할 요소를 가리킨다.

iterator erase (const_iterator first, const_iterator last);

first 와 last 사이의 모든 요소를 포함해서 요소들을 제거한다.

 

erase 함수를 통해 요소를 지우게 되면 지운 요소 뒤에 있는 요소를 새 위치로 가리키게 된다.

 

vector erase reference site

 

레퍼런스에 있는 내용들을 간단하게 정리해봤다.
erase 함수는 해당 인덱스에 해당하는 값을 지우고 뒤에 있는 데이터를 앞으로 이동시킨다.
따라서, erase 함수를 사용하게 되면 정해진 요소가 지워지고 크기 또한 감소하게 된다.
그리고 지운 요소 뒤의 값을 가리키게된다.

 

하지만 여기서 주의해야할 점은 반복문과 조건문을 사용할 때이다.
간단한 예를 들어 보자.

 

우선, int형 vector를 만들고 반복문을 통해 vector 안에 값을 넣어준다.
vector에 값을 넣을 때에는 push_back() 을 통해 값을 넣어줄 수 있다.
그리고 vector 안의 값을 출력해준다.

#include <iostream>
#include <vector>

using namespace std;

int main(){
    vector<int> vec;
	
    for(int i=0; i<10; i++) {
        vec.push_back(i*10); // 0~90 까지의 값 push
    }
    
    for(int i=0; i<vec.size(); i++) {
        cout << "vec[" << i <<"] : " << vec[i] << "\n"; // vec 안에 있는 값 출력 
    }
}
vec[0] : 0
vec[1] : 10
vec[2] : 20
vec[3] : 30
vec[4] : 40
vec[5] : 50
vec[6] : 60
vec[7] : 70
vec[8] : 80
vec[9] : 90

vector에 들어간 값을 확인할 수있다.


그럼 이제 i = 4 일 때, 4번 째 인덱스의 값을 지우고나서 출력을 해보았다.

#include <iostream>
#include <vector>

using namespace std;

int main(){
	vector<int> vec;
	
	for(int i=0; i<10; i++) vec.push_back(i*10); // 10~100 까지의 값 push 
	
	for(int i=0; i<vec.size(); i++) {
		if(i == 4) {
			vec.erase(vec.begin()+4); // 시작부터 4번째에 있는 값 삭제
			cout << "vec[" << i <<"] : " << vec[i] << "\n"; // vec 안에 있는 값 출력 	
		} else {
			cout << "vec[" << i <<"] : " << vec[i] << "\n"; // vec 안에 있는 값 출력 	
		}
	}
    
	return 0;
} 
vec[0] : 0
vec[1] : 10
vec[2] : 20
vec[3] : 30
vec[4] : 50
vec[5] : 60
vec[6] : 70
vec[7] : 80
vec[8] : 90

위의 결과와 아래의 결과를 확인해보면
4번 째 인덱스의 원래 값인 40이 사라지고 50이 되었고, ( vec[4] = 40 -> vec[4] = 50 )
vector의 크기 또한 9에서 8로 감소한 것을 확인할 수 있었다. ( 마지막 인덱스 vec[8] )

 

이 때 주의해야 할 점이 있다.
erase 함수를 통해 4번 인덱스를 제거한다면 반복문을 통해 다음 5번 인덱스의 값을 출력해야 한다.
그럼 50이 나오는 것이 아닌 60이 나오게 된다.
그 이유는 erase 함수를 통해 해당 요소를 지운 후 지워진 요소 뒤의 요소를 가리키기 때문이다.
(erase 함수를 사용하고 난 뒤 vec[4] = 50을 가리키게 되고 반복문을 통해 다음 값이 50이 아닌 vec[5] = 60 이 나온다.)

 

그리고 조건문에서도 출력을 해주었기 때문에 vec[4] 의 값이 나오게 된다.
하지만 조건문에서 출력을 하지 않으면 vec[4]의 값을 건너뛰게 된다.

 

따라서,
erase 함수를 사용할 때 반복자를 어느 부분에서 증가시켜주느냐에 따라서 원하는 결과가 달라질 수 있다는 것이다.

728x90
반응형
복사했습니다!