그냥 게임개발자
이터레이터! 본문
이터레이터는 컨테이너에 저장되어 있는 요소의 주소를 가리키는 개체를 말한다.
그냥 그거다
주소를 가리킨다라고생각하자.
그게 편해나는
그리고 컨테이너는 담을 수 있는 공간이라고 생각하는게 편해요
그게 편해 나는

그래서 담을 수 있는 공간을 생각해보자.
vector, map 이런게 있다.
각각 다르게 구현된컨테이너들을 일반화된 이터레이터를 통해 쉽게 순회할 수 있다.
여러가지 방법이 있다.
배열을 보자.

ㅇㅇㅇ
그렇다면 리스트는?

ㅇㅇ
그러면 스택은?

ㅇㅇㅇㅇ
여기서 이런 각각의 컨테이너의 한 주소를 가리키는 개체가 바로 이터레이터이다.
오우씨 나 그림 잘그리네
아무튼
이터레이터는 주소를 가리키는 개체인데 다만 주소값을 바로 반환하지는 못해서 &*를 통해 한단계 더 거쳐서 가리키는 해당 요소의 주소값을 반환할 수 있다.
이터레이터를 통해 사용하는 코드를 보자.
#include <iostream>
using namespace std;
vector<int> v;
int main()
{
for (int i = 1; i <= 5; ++i)
v.push_back(i);
for (int i = 0; i < 5; ++i)
{
cout << i << "번째 요소 : " << *(v.begin() + i) << '\n';
cout << &*(v.begin() + i) << '\n';
}
for (auto it = v.begin(); it != v.end(); ++it)
{
cout << *it << ' ';
}
cout << '\n';
for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
{
cout << *it << ' ';
}
auto it = v.begin();
advance(it, 3);
cout << '\n';
cout << *it << '\n';
}
일단 결과물을 보고 복습해보자.

일단 어려운 건 없다.
for (int i = 1; i <= 5; ++i)
v.push_back(i);
초기화 시켜주고
for (int i = 0; i < 5; ++i)
{
cout << i << "번째 요소 : " << *(v.begin() + i) << '\n';
cout << &*(v.begin() + i) << '\n';
}
인덱스를 통해 이터레이터의 주소의 *(에스터 리스크를 통해) 값을 참조하게 된다.
근데 그 값의 주소를 알고 싶어서 &*라는 연산자를 사용해 주소도 출력한다.
for (auto it = v.begin(); it != v.end(); ++it)
{
cout << *it << ' ';
}
for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
{
cout << *it << ' ';
}
그렇다면 이거는 무엇일까
auto를 쓰는 이유는
vector<int>::iterator
이거 표현하기 귀찮아서 또는 가독성이 좋지 않아서이다.
대부분 auto로 쓰긴한다.
이터레이터는 주소를 반환한다고 하지 않았나?
그럼 그 주소의 값을 참조하려면 *에스터 리스크를 통해 값을 얻어올수 있다.
ㅇㅇ
그러면 여기서 iterator에서 자주 쓰는 함수 3개를 알아보자.
begin()
컨테이너의 시작 위치를 반환
end()
컨테이너의 끝 다음의 위치를 반환한다.
보통 it != v.end()로 조건을 많이 사용한다.
이는 컨테이너를 다 순회하고 컨테이너의 끝에 도착했다는 것을 가리킨다.
advance(iterator, cnt)
해당 iterator를 cnt(count)까지 증가시킨다.
'C++ 나만의 복습' 카테고리의 다른 글
이터레이터는 일반화된 포인터인가? (0) | 2024.04.07 |
---|---|
이터레이터와 포인터의 차이 (0) | 2024.04.07 |
프로세스 메모리 구조와 정적할당과 동적할당 (0) | 2024.04.07 |
문자를 숫자로, 숫자를 문자로 (0) | 2024.04.07 |
unique() (0) | 2024.04.07 |