- STL, Standard Template Libarary
- STL은 표준 템플릿 라이브러리의 약자로, C++에서 미리 만들어진 템플릿을 이용하기 위해 불러와 사용하는 라이브러리입니다.
- STL 의 구성 요소
- C++ 표준 템플릿 라이브러리인 STL은 다음과 같은 구성 요소로 이루어진 템플릿을 제공합니다.
- 반복자 (iterator)
- 컨테이너 (container)
- 알고리즘 (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
'Program Language > C++ 언어' 카테고리의 다른 글
16. C++ STL 알고리즘, 입력과 출력, 예외 처리 (0) | 2024.07.15 |
---|---|
15. C++ STL 컨테이너 : 시퀀스 컨테이너, 연관 컨테이너, 컨테이너 어댑터 (0) | 2024.07.09 |
13. C++ OOP 개념 이해하기 : 캡슐화, 상속성, 다형성 (1) | 2024.06.17 |
12. C++ 생성자와 소멸자, 연산자 오버로딩 (0) | 2024.06.15 |
11. C++ 함수의 범위와 클래스 (0) | 2024.06.07 |