STL iterator; 반복자 C++

sunghoon·2025년 3월 24일
0

2.0 Glove Project

목록 보기
31/35

🧇 반복자 iterator

반복자는 포인터처럼 동작하도록 만든 클래스 객체
포인터처럼 *, ++, == 연산 설계 (연산자 오버로딩)
컨테이너마다 구조에 맞게 다르게 구현

개념

반복자는 컨테이너의 구간에 대해 값을 읽어올 수 있도록 기능을 제공한다.

모든 컨테이너에 대해서 동일하게 동작하여 값을 얻어올 수 있게 한다.

반복자를 쓰는 이유

  • vector는 연속된 메모리 → 진짜 포인터처럼 사용 가능
  • list는 이중 연결 리스트 → 포인터는 안 되고, 내부 구조에 맞는 방식 필요
반복자가 필요한 이유설명
컨테이너와 무관한 반복구조 몰라도 동일한 방식으로 순회 가능
범용 코드 작성템플릿 함수 등에 활용 가능
STL 알고리즘 사용sort, find 등과 함께 쓰임
포인터처럼 사용 가능*it로 값 접근, ++it로 이동 가능

범위

반복자는 포인터와 흡사하다.

예를 들어 정수 배열을 가리키는 포인터일 경우 ++연산을 하게 되면 그 다음번 주소의 정수값을 읽을 수 있듯이 반복자 또한 ++ 연산을 적용할 수 있다.

포인터는 그 다음 주소값을 읽어오지만 반복자는 다음번 요소를 읽어온다.

포인터와 반복자 비교

포인터를 통한 정수 배열 접근

int arr[] = {1, 2, 3, 4, 5};
int* pNum;

for(pNum = &arr[0]; pNum!=&arr[5]; pNum++)
{
    cout << *pNum << endl;
}

포인터를 통한 문자열 배열 접근

char arr [] = "programming";
char* pArr = arr;

while(*pArr) {
    cout << *pArr << endl;
    pArr++;
}

⬜ 반복자의 사용 형태

메소드

선언

컨테이너<int>::iterator it;
  • begin() : 처음 인덱스 요소
  • end(): 마지막 인덱스 요소

vertor 클래스 안에 iterator라는 반복자 타입이 정의되어 있다.

변수 it를 선언하면 벡터의 한 요소를 가리키는 반복자가 된다.

⬜ vector

/* vector<int> 벡터이름(처음주소, 마지막주소)
vector<int>::iterator it; */

int arr[] = {1, 2, 3, 4, 5};
vector<int> vArr(&arr[0], &arr[5])
vector<int>::iterator it;

for(it = vArr.begin(); it != vArr.end(); it++)
{
    cout << *it << endl;
}

⬜ list

list<int> lst;
list<int>::iterator it;

for(int i = 0; i< 5; i++) {
    lst.push_back(i + 1);
}
for(it = lst.begin(); it != lst.end(); it++)
{
    cout << *it << endl;
}

⬜  set

int arr[] = {1, 2, 4, 2, 5, 6, 3};
set<int> scon;
for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) {
	scon.insert(arr[i]);
}

⬜ map

struct PhoneAddr
{
    string name;
    int phonenum;
}arPerson[] =
{
    {"홍길동",5151},
    {"김선생",2535},
    {"밧대리",6994},
    {"오징어",7774}
};
int main() {
  map<string, int> person;
  map<string, int>::iterator it;
  int i;
  string name;
  for (i = 0; i < sizeof(arPerson) / sizeof(arPerson[0]); i++) {
    person[arPerson[i].name] = arPerson[i].phonenum;
  }

  for (;;) {
    cout << "이름 입력: ", cin >> name;
    if (name == "q") break;
    it = person.find(name);
    if (it == person.end()) {
      cout << "그런 사람은 없습니다." << endl;
    } else {
      cout << name << " 의 전화번호는 " << it->second << "입니다." << endl;
    }
  }

  return 0;
}
profile
프라다 신은 빈지노와 쿠페를 타는 꿈을 꿨다.

0개의 댓글