코딩 테스트에서 STL을 활용하면 효율적인 자료구조 및 알고리즘 구현이 가능합니다. STL을 사용할 때 가장 중요한 개념 중 하나가 바로 Iterator(반복자)입니다. 모든 STL 컨테이너(queue, stack, map, unordered_map 등)에서 iterator를 사용하기 때문에, 이를 먼저 익혀두는 것이 중요합니다. 이번 포스팅에서는 iterator의 개념부터 사용법, 시간 복잡도, 그리고 코딩 테스트에서 자주 쓰이는 패턴까지 완벽히 정리하겠습니다.
1. Iterator란?
Iterator(반복자)는 STL 컨테이너 내부 요소를 순회하는 데 사용되는 객체입니다. 배열의 인덱스를 직접 사용하는 대신, iterator를 활용하면 더 범용적인 코드 작성이 가능합니다.
Iterator의 역할
- 컨테이너 내 원소 순회
- 원소 삽입, 삭제, 변경
- 반복 구조 최적화
2. Iterator의 원리
iterator는 포인터와 유사한 방식으로 동작하지만, 단순한 메모리 주소가 아니라 컨테이너 요소를 안전하게 조작할 수 있는 인터페이스를 제공합니다.
주요 기능 및 연산자
- begin() : 컨테이너의 첫 번째 원소를 가리키는 반복자 반환
- end() : 컨테이너의 마지막 다음 위치를 가리키는 반복자 반환
- ++it : 반복자를 다음 요소로 이동 (전위 증가)
- it++ : 반복자를 다음 요소로 이동 (후위 증가)
- --it : 반복자를 이전 요소로 이동 (전위 감소)
- it-- : 반복자를 이전 요소로 이동 (후위 감소)
- *it : 반복자가 가리키는 요소 접근
3. STL Iterator 사용법
STL에서 제공하는 iterator를 활용하면 다양한 컨테이너에서 원소를 순회할 수 있습니다.
예제 1: 벡터 순회
#include <stdio.h>
#include <vector>
using namespace std;
int main() {
vector<int> vec = {1, 2, 3, 4, 5};
for (vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
printf("%d ", *it);
}
printf("\n");
return 0;
}
예제 2: 리스트 순회
#include <stdio.h>
#include <list>
using namespace std;
int main() {
list<int> lst = {10, 20, 30, 40};
for (list<int>::iterator it = lst.begin(); it != lst.end(); ++it) {
printf("%d ", *it);
}
printf("\n");
return 0;
}
예제 3: 맵 순회
#include <stdio.h>
#include <map>
using namespace std;
int main() {
map<string, int> mp = {{"apple", 3}, {"banana", 5}, {"cherry", 2}};
for (map<string, int>::iterator it = mp.begin(); it != mp.end(); ++it) {
printf("%s: %d\n", it->first.c_str(), it->second);
}
return 0;
}
4. auto 키워드란?
C++11부터 추가된 auto 키워드는 변수의 타입을 자동으로 추론해 주는 기능을 합니다. iterator 선언 시 반복자의 타입을 명확히 작성해야 하는 번거로움을 줄이고, 가독성을 높이는 역할을 합니다.
auto 사용 전
map<string, int> mp = {{"apple", 3}, {"banana", 5}, {"cherry", 2}};
for (map<string, int>::iterator it = mp.begin(); it != mp.end(); ++it) {
printf("%s: %d\n", it->first.c_str(), it->second);
}
auto 사용 후
for (auto it = mp.begin(); it != mp.end(); ++it) {
printf("%s: %d\n", it->first.c_str(), it->second);
}
auto의 장점
- 코드 가독성 향상: 긴 타입 선언 없이 간결하게 코드를 작성할 수 있습니다.
- 유지보수 용이: 컨테이너의 타입이 변경되더라도 auto를 사용하면 반복자 선언을 수정할 필요가 없습니다.
- 복잡한 타입 생략 가능: 템플릿 기반의 컨테이너에서는 반복자 타입이 매우 길어질 수 있는데, auto를 사용하면 쉽게 처리할 수 있습니다.
auto키워드에 대한 자세한 설명은 아래 포스팅에 작성했습니다.
2025.02.22 - [STL] - [C언어/C++] auto 키워드 완벽 정리 - 개념, 원리, 사용법, 예제, 주의사항
[C언어/C++] auto 키워드 완벽 정리 - 개념, 원리, 사용법, 예제, 주의사항
C++에서 auto 키워드는 변수의 타입을 자동으로 추론해주는 기능을 제공합니다. C++11부터 도입된 이 기능은 코드의 가독성을 높이고, 유지보수를 용이하게 만드는 중요한 역할을 합니다. 본 포스
best-coding.tistory.com
5. 시간 복잡도
연산 | 시간 복잡도 |
++it, --it | O(1) |
*it | O(1) |
begin(), end() | O(1) |
6. 코딩 테스트에서 자주 쓰이는 패턴
벡터에서 iterator 활용
vector<int> vec = {1, 2, 3, 4, 5};
for (auto it = vec.begin(); it != vec.end(); ++it) {
printf("%d ", *it);
}
맵에서 iterator 활용
map<string, int> mp = {{"apple", 3}, {"banana", 5}, {"cherry", 2}};
for (auto it = mp.begin(); it != mp.end(); ++it) {
printf("%s: %d\n", it->first.c_str(), it->second);
}
7. 주의사항
- iterator가 end()를 초과하여 접근하지 않도록 주의해야 합니다.
- iterator가 유효한 범위를 유지하도록 신경 써야 합니다.
- iterator를 활용할 때 컨테이너가 변경될 경우, 무효화된 반복자를 사용하지 않도록 해야 합니다.
이번 포스팅에서는 iterator의 개념과 STL에서 제공하는 iterator를 활용하는 방법을 살펴보았습니다. 또한 auto 키워드를 이용해 반복자 선언을 더욱 간결하게 만드는 방법도 다루었습니다. iterator는 STL을 활용하는 핵심 개념이므로 충분히 익혀야 합니다
'STL' 카테고리의 다른 글
[C언어/C++] auto 키워드 완벽 정리 - 개념, 원리, 사용법, 예제, 주의사항 (0) | 2025.02.22 |
---|---|
[C언어/C++] STL: Vector 사용법 총 정리: 개념, 주요함수, 예제코드 (3) | 2024.12.23 |
코딩테스트에서 자주 쓰이는 STL 총정리 (1) | 2024.12.23 |
STL set 구조체 활용(4) - 특정 원소에 빠르게 찾기 (0) | 2023.04.03 |
STL set 구조체 활용(3) - set에 구조체 포인터 담기 (0) | 2023.03.30 |
댓글