Program Language/C++ 언어

14. C++ STL 반복자

parkes811 2024. 7. 9. 12:39


  • STL, Standard Template Libarary

- STL은 표준 템플릿 라이브러리의 약자로, C++에서 미리 만들어진 템플릿을 이용하기 위해 불러와 사용하는 라이브러리입니다.

 

  •  STL 의 구성 요소

-  C++ 표준 템플릿 라이브러리인 STL은 다음과 같은 구성 요소로 이루어진 템플릿을 제공합니다.

  1. 반복자 (iterator)
  2. 컨테이너 (container)
  3. 알고리즘 (algorithm)

 

  •  STL 반복자

- 반복자는 컨테이너의 요소를 순회하는 객체입니다.

- 마치 포인터처럼 동작하며, 요소에 접근하거나 조작할 수 있습니다.

 

- 반복자의 종류

 - STL은 제공하는 기능에 따라 반복자를 다음과 같이 다섯 가지로 분류하고 있습니다.

 

1. 입력 반복자(input iterator)

 - 가장 단순한 형태의 반복자로, 컨테이너로부터 값을 읽는데 사용

 - 입력 반복자를 사용하면 컨테이너로부터 값을 읽을 수는 있지만, 프로그램이 그 값을 변경할 수는 없습니다.

 

2. 출력 반복자(output iterator)

 - 컨테이너의 값을 변경하는데 사용

 - 출력 반복자를 사용하면 컨테이너의 값을 변경할 수는 있지만, 프로그램에서 값을 읽을 수는 없습니다.

 

3. 순방향 반복자(forward iterator)

 - 입출력이 모두 가능한 반복자

 - 증가 연산자(++)를 사용하여 순방향으로만 이동할 수 있습니다.

 

4. 양방향 반복자(bidirectional iterator)

 - 입출력이 모두 가능한 반복자

 - 증가 연산자(++)를 사용하면 순방향, 감소 연산자(--)를 사용하면 역방향으로도 이동할 수 있습니다.

 

5. 임의 접근 반복자(random access iterator)

 - 최상위 레벨의 반복자로서 가장 많은 기능을 제공

 - 양방향 반복자의 모든 기능을 포함하고, 첨자 연산자([])를 통해 임의의 요소에 접근할 수 있습니다.

 


 

  •  반복자 계층

 - STL의 반복자는 알고리즘의 적용 조건을 제한하기 위해 계층적으로 분류됩니다.

 

  •  기타 반복자
  • iterator 헤더 파일

 - STL은 iterator 헤더 파일을 통해 미리 정의된 몇 가지 반복자를 제공합니다.

 - 이 헤더 파일은 미리 정의된 반복자뿐만 아니라 스트림 반복자, 반복자의 원형 그리고 여러 지원 템플릿을 포함하고 있습니다. 

 

  • 스트림 반복자(stream iterator)

- 스트림 반복자는 반복자 연산을 통해 알고리즘이 입출력 스트림에 보다 쉽게 접근할 수 있게 해줍니다.

- 입력 스트림 반복자는 istream_iterator, 출력 스트림 반복자는 ostream_iterator 클래스 템플릿에서 제공합니다.

- 예제

vector<int> vc = {1, 2, 3, 4, 5};
copy(vc.begin(), vc.end(), ostream_iterator<int>(cout));
cout << endl;
copy(vc.begin(), vc.end(), ostream_iterator<int>(cout, " "));

// 실행 결과
// 12345
// 1 2 3 4 5

 


  • 삽입 반복자(insert iterator)

- 삽입 반복자는 반복자의 복사 연산을 삽입 연산으로 변환해 주는 역할을 합니다.

- STL에서 제공하는 삽입 반복자는 다음과 같습니다.

 

 1. insert_iterator

 2. back_insert_iterator

 3. front_insert_iterator

 - 예제 

list<int> ls = {10};
ls.push_back(20); // back_insert_iterator를 사용함.
ls.push_front(30); // front_insert_iterator를 사용함.
copy(ls.begin(), ls.end(), ostream_iterator<int>(cout, " "));

// 실행 결과
// 30 10 20

 


 

  • 역방향 반복자(reverse iterator)

 - 순방향 반복자와는 반대 방향으로 동작하는 반복자입니다.

 - 역방향 반복자의 증가 연산자(++)는 순방향 반복자의 역방향으로 이동하게 됩니다.

 - rbegin()과 rend() 멤버 함수를 사용하면 자동으로 reverse_iterator를 반환합니다.

 - 예제

list<int> ls = {10, 20, 30};
copy(ls.rbegin(), ls.rend(), ostream_iterator<int>(cout, " "));

// 실행 결과
// 30 10 20

 


 

  • 상수 반복자(constant iterator)

- 반복자가 가리키는 값의 변경이 불가능한 반복자를 상수 반복자(constant iterator)라고 합니다.

list<int> ls = {10, 20, 30};
list<int>::iterator iter;
list<int>::const_iterator citer;
 
iter = ls.begin();
*iter = 100;
citer = ls.end();
// *citer = 300; // 상수 반복자이므로 값의 변경은 불가능함.

for(citer = ls.begin(); citer != ls.end(); citer++) {
    cout << *citer << " ";
}

// 실행 결과
// 100 20 30