728x90

황기태 저자의 명품 C++ Programming 개정판을 읽고 학습한 내용을 정리한 포스트입니다!

https://search.shopping.naver.com/book/catalog/32436115747

 

C++ Programming : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com


개요

  • 표준 템플릿 라이브러리(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가지로 분류한다.

  1. 순차 컨테이너(Sequence Container) - vector, dequeue, list 등으로서 연속적인 메모리 공간에 순서대로 값을 저장하고 읽는 컨테이너이다. 인덱스를 사용하여 컨테이너 내의 특정 위치에 있는 값을 읽거나 변경할 수 있다.
  2. 컨테이너 어댑터(Container Adaptor) - 다른 컨테이너를 상속받아 기능 중 일부만 공개하여 기능을 제한하거나 변형한 컨테이너로 stack, queue 등이 있다.
  3. 연관 컨테이너(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