
C++ STL 라이브러리의 Vector 클래스를 활용하여 문제를 풀 때 사용되는 개념과 문법 공부 기록기.
vector의 iterator로 erase() 사용시 주의사항을 지켜야 합니다.
vector의 반복자 iterator는 벡터에 저장된 원소들에 순차적인 접근이 가능합니다. 일종의 포인터라고 할 수 있습니다.
[ iterator 선언법 ]
vector<자료형명>::iterator 변수명;
ex) vector<int>::iterator i; // 벡터 클래스 내에 정의된 iterator 선언
[ 일반적인 for문에서의 사용법 ]
for (i = v.begin(); i != v.end();) // 벡터의 처음과 끝을 가리키는 begin(), end() 함수를 사용합니다.
begin(): 벡터의 첫 번째 데이터가 있는 시작 주소를 반환합니다.
end(): 벡터의 마지막 데이터보다 한 칸 뒤의 위치 값을 반환합니다.
이를 수학용어로 표현하면 반개구간이라고 합니다. [begin, end)
위 for 조건문에서 i++로 이터레이터의 값을 증가시키지 않는 이유는 erase 함수의 사용때문입니다.
erase 함수를 사용하여 해당 인덱스의 데이터를 지우면,
그 뒤에 있는 데이터들은 삭제되고 남은 데이터들은 삭제된 자리만큼 앞으로 이동됩니다.
또한 해당 iterator의 요소를 삭제해버리면 그 iterator는 무효화가 되어 사라집니다.
if 조건문을 만족시킬 시 erase 함수를 사용한다면,
erase 함수가 실행되면 벡터의 뒷 요소들이 삭제된 칸만큼 앞으로 당겨지므로,
erase의 반환값을 다시 it에 대입시키면 됩니다.
그렇기 때문에 erase 함수가 실행되지 않은 경우에만 i++ 를 해주면 됩니다.
#include <iostream>
#include <vector>
using namespace std;
int main(void){
vector<int> v({1, 2, 3, 4, 5, 6, 7, 8}); // 벡터 선언 및 초기화
vector<int>::iterator i; // 반복자 iterator 선언
for (i = v.begin(); i != v.end();) { // for 문 자체에서 i++ 하지 않음에 주의
if (*i == 5) {
i = v.erase(i); // 해당 요소(5)를 제거 후 그 다음 요소(6)의 i를 반환
} else { i++; } // erase() 함수 미수행 시에는 i 증가 시켜줘야 함
}
return 0;
}
'C++' 카테고리의 다른 글
[프로그래머스] 코딩테스트 연습 타겟 넘버 풀이 C++ 소스 코드 (0) | 2020.04.21 |
---|---|
[C++] 프로그래머스 카펫 문제풀이 코드 (완전탐색) (0) | 2020.04.16 |
[C++] string to int 변환 / int to string 변환 /stoi(), to_string() (0) | 2020.04.14 |
[C++] 재귀함수로 순열 구현하기 코드 (0) | 2020.04.14 |
[C++] 프로그래머스 'K번째 수' 문제 풀이 (0) | 2020.04.08 |