반복자에 대해 ' 포르잔 C++ 바이블' 책을 통해 기본적인 내용을 정리했습니다.
https://dev0404.tistory.com/31
[C++] 반복자(iterator)
1. 반복자 구조반복자(iterator)는 포인터를 추상화한 것입니다. 포인터는 C++이 제공하는 문법이므로 추가적인 제한을 걸거나 기능을 추가할 수 없지만 반복자라는 객체로 포인터를 추상화하면,
dev0404.tistory.com
추가로 ' 266가지 문제로 정복하는 코딩 인터뷰 in C++' 책의 반복자에 대한 내용을 정리하겠습니다. 예시는 제가 짠 코드로 틀린 내용이 있을 수도 있습니다.
반복자와 포인터의 유사점과 차이점을 설명하라
해법 : 둘 다 값을 얻기 위해 역참조할 수 있다는 점에서 비슷하다. 차이점은 다음과 같다
1. 포인터는 메모리에 주소를 보유한다. 반복자는 포인터를 보유할 수 있지만 훨씬 더 복잡할 수 있다. 예를 들어 반복자는 파일 시스템에 있거나 여러 시스템에 분산되어 있거나 프로그래밍 방식으로 로컬에서 생성된 데이터를 반복할 수 있다. 적절한 예는 연결 리스트에 대한 반복자다. 반복자는 램의 여러 곳에 주소가 흩어져 있는 노드의 원소를 통해 이동한다.
// 포인터
int x = 10;
int* p = &x; // x의 메모리 주소를 포인터 p에 저장
// 반복자
std::list<int> linked_list = {10, 20, 30, 40, 50};
std::list<int>::iterator it;
// 반복자를 사용하여 리스트 순회
for (it = linked_list.begin(); it != linked_list.end(); ++it) {
std::cout << *it << " "; // 반복자가 가리키는 값 출력
}
2. 포인터에 증가, 감소, 정수 추가 같은 산술 연산을 수행할 수 있다. 하지만 모든 반복자가 이러한 작업을 허용하는 것은 아니다. 예를 들어, 순방향 반복자를 감소시키거나 비-임의 접근 반복자에 정수를 추가할 수 없다.
std::list<int> lst = {1, 2, 3};
auto it = lst.begin();
++it; // 가능
--it; // 불가능 (list의 반복자는 순방향 반복자이기 때문)
3. T* 타입의 포인터는 모든 T 타입의 객체를 가리킬 수 있다. 반복자는 좀 더 제한적이다. 예를 들어, vector<double>::iterator는 vector<double> 컨테이너 내부의 double만 참조할 수 있다.
std::vector<int> vec_int = {1, 2, 3};
std::vector<double>::iterator it_int = vec_int.begin(); // 오류: 타입 불일치
4. 반복자는 포인터와 다르게 컨테이너의 객체를 참조하므로 반복자에 대한 삭제 개념이 없다. (컨테이너는 메모리 관리를 담당한다)
// 포인터
int* p = new int(10); // 메모리 할당
delete p; // 메모리 해제 -> 안하면 메모리 누수 발생
// 반복자
std::vector<int> vec = {1, 2, 3};
auto it = vec.begin();
// vec가 소멸되면 it도 더 이상 유효하지 않음
출처 : 266가지 문제로 정복하는 코딩 인터뷰 in C++
'내일배움캠프 > TIL' 카테고리의 다른 글
[내일배움캠프 Day14] 디자인 패턴 - 생성 패턴 (1) | 2025.01.06 |
---|---|
[내일배움캠프 Day13] C++ 2주차 과제 진행 (1) | 2025.01.03 |
[내일배움캠프 Day11] 템플릿 (1) | 2024.12.31 |
[내일배움캠프 Day10] 메모리 관리 (0) | 2024.12.31 |
[내일배움캠프 Day9] 포인터 (0) | 2024.12.27 |