728x90
황기태 저자의 명품 C++ Programming 개정판을 읽고 학습한 내용을 정리한 포스트입니다!
https://search.shopping.naver.com/book/catalog/32436115747
개요
- 표준 템플릿 라이브러리(Standard Template Library, STL)는 템플릿으로 작성된 많은 제네릭 클래스와 함수 라이브러리이다.
- ISO/ANSI C++ 표준위에서는 STL을 C++의 표준으로 채택하여 현재 C++ 표준 라이브러리에 포함되게 되었다.
- STL에 포함된 제네릭 클래스와 함수들은 컨테이너, iterator, 알고리즘크게 3가지로 분류된다.
- 또한 이 세가지 중 하나만 사용하는 경우는 드물기 때문에, 3가지 모두 잘 학습해두자!
iterator - 컨테이너 원소에 대한 포인터
- iterator는 반복자라고 불린다.
- 컨테이너의 원소들을 하나씩 순회 접근하기 위해 만들어진 컨테이너 원소에 대한 포인터 (stack, queue에는 iterator 없음)
- 원소를 읽기 위한 iterator, 기록하기 위한 iterator, 둘 다 가능한 iterator 등 다양하게 존재한다.
- 가장 많이 사용하는 메소드는 begin()과 end()이며, 컨테이너의 시작점, 그리고 끝 점 + 1을 리턴한다는 점과, 리턴 값이 주소이지 값(value)가 아니라는 점도 주의해야 한다.
- 또한, cbegin(), cend()와 같이 읽기 전용(const_iterator)도 존재한다.
- 흔히 사용하는 for loop의 내부 구조를 까보면 iterator와 완전히 동일하게 작동하기에 이미 iterator를 적극적으로 사용하고 있는 것이다.
- 위 코드는 어셈블리 구조상 완전히 동일하다.
알고리즘 - 템플릿 함수
- 컨테이너 원소에 대한 복사(copy), 검색(find, search), 삭제(remove), 정렬(sort) 등의 기능을 구현한 템플릿 함수로서 통칭하여 알고리즘이라고 부르며 전역 함수이며 iterator와 함께 작동한다.
- 컨테이너 클래스의 멤버 함수가 아니다.
컨테이너(container) - 템플릿 클래스
- 데이터를 저장하고 검하기 위해 담아두는 자료 구조를 구현한 클래스
- 리스트(list), 큐(queue), 스택(stack), 맵(map), 셋(set), 벡터(vector) 등이 있다.
컨테이너 분류
STL 컨테이너 클래스는 저장되는 원소를 다루는 방식에 따라 3가지로 분류한다.
- 순차 컨테이너(Sequence Container) - vector, dequeue, list 등으로서 연속적인 메모리 공간에 순서대로 값을 저장하고 읽는 컨테이너이다. 인덱스를 사용하여 컨테이너 내의 특정 위치에 있는 값을 읽거나 변경할 수 있다.
- 컨테이너 어댑터(Container Adaptor) - 다른 컨테이너를 상속받아 기능 중 일부만 공개하여 기능을 제한하거나 변형한 컨테이너로 stack, queue 등이 있다.
- 연관 컨테이너(Associative Container) - '키'로 '값'을 저장하고 '키'로 검색하여 '값'을 알아내는 컨테이너로서 set, map 등이 있다.
헤더 파일
- STL은 std 이름 공간에 작성되었기 때문에, STL을 사용하려면 다음 코드가 필요하다.
using namespace std;
- 필요한 컨테이너 클래스를 사용하고자 하면 해당 템플릿이 선언된 헤더 파일을 include 시켜야 한다. 알고리즘 함수 또한 마찬가지이다.
#include <vector>
#include <algorithm>
vector 컨테이너 활용
- vector는 가변 길이 배열을 구현한 제네릭 클래스이다.
자세한 내용은 vector에 대해 설명한 게시물을 참조하고 여기서는 vector를 활용하여 위에서 살펴본 STL을 사용해보자.
- 아래 코드는 vector를 생성하고, iterator를 이용하여 vector의 모든 원소들에 2를 곱하는 예제이다.
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v; //정수 벡터 생성
v.push_back(1);
v.push_back(2);
v.push_back(3);
vector<int>::iterator it; // 벡터 v의 원소에 대한 포인터 it 선언
for(it=v.begin(); it != v.end(); it++) { // iterator를 이용하여 모든 원소 탐색
int n = *it; // it가 가리키는 원소 값 리턴
n = n*2; // 곱하기 2
*it = n; // it가 가리키는 원소에 값 쓰기
}
for(it=v.begin(); it != v.end(); it++) // 벡터 v의 모든 원소 출력
cout << *it << ' ';
cout << endl;
}
- 아래 코드는 sort() 함수를 이용하여 vector를 정렬하는 예시이다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> v; // 정수 벡터 생성
cout << "5개의 정수를 입력하세요>> ";
for(int i=0; i<5; i++) {
int n;
cin >> n;
v.push_back(n); // 키보드에서 읽은 정수를 벡터에 삽입
}
// v.begin()에서 v.end() 사이의 값을 오름차순으로 정렬
// sort() 함수의 실행 결과 벡터 v의 원소 순서가 변경됨
sort(v.begin(), v.end());
vector<int>::iterator it; // 벡터 내의 원소를 탐색하는 iterator 변수 선언
for(it=v.begin(); it != v.end(); it++) // 벡터 v의 모든 원소 출력
cout << *it <<' ';
cout << endl;
}
STL 설계 원칙
- STL 컨테이너는 스스로 크기를 조절하여 원소의 개수로 인한 사용자의 부담을 덜어준다.
- 또한, STL iterator는 컨테이너 종류에 무관하게 컨테이너의 원소들을 검색할 수 있도록 설계되었음
- STL 알고리즘 역시 컨테이너 종류에 상관없이 작동하도록 설계되었다.
728x90
'Programming Language > C++' 카테고리의 다른 글
[C++] Array with Cpp (1) | 2023.12.20 |
---|---|
[C++] auto와 람다식 (0) | 2023.12.20 |
[C++] 제네릭 클래스 만들기 (1) | 2023.12.19 |
[C++] 다양한 제네릭 함수 만들기 (0) | 2023.12.19 |
[C++] 템플릿 (0) | 2023.12.19 |