C & C++/C++ STL

[C++/STL] STL이란?

  • -
728x90

2019-09-03 updated

평소 알고리즘 문제를 풀면서 STL을 지양하면서 직접 자료구조를 만들어서 (예를들어 queue나 stack 같은..) 구조를 이해하며 문제에 적용시켜 푸는 것을 즐겼다. 하지만 우선순위 큐를 이용하거나 다익스트라 알고리즘이 필요한 문제들이 나오면 어떻게해야할지 막막해졌다. 그래서 STL을 공부해보기로 한다.


STL

그렇다면 STL은 무엇일까?
STL이란 Standard Template Library의 약자로 표준 라이브러리이다.
컨테이너(Container, 자료구조) Class/ 반복자/ 알고리즘간의 협력에 기반한 템플릿 라이브러리이다.

STL없이 알고리즘을 작성할 때 내 입맛에 맞춰 작성하여 문제를 푸는 일이 생각보다 까다롭고 변수 타입에따라 여러가지 벽에 부딪히기도 했다.
C++은 template라는 것을 통해서 한 가지 타입에 특정되지 않고, 여러 타입에 일반적인 문법을 사용할 수 있다.

2019-09-27 updated


보통 c++ STL을 일컷는다면 다음과 같은 세 개의 라이브러리들을 의미한다.

  • 임의 타입의 객체를 보관할 수 있는 컨테이너(container)
  • 컨테이너에 보관된 원소에 접근할 수 있는 반복자(iterator)
  • 반복자들을 가지고 일련의 작업을 수행하는 알고리즘(algorithm)

Container 종류

  1. Sequence Container(순차 컨테이너)
  • 배열
  • 동적배열
  • 데크 (양방향 큐)
  • <forward_list> 단방향 리스트
  • 양방향 리스트
  1. Associative Container(정렬 연관 컨테이너)
  • 정렬된 유일 key 집합
  • 정렬된 유일 key와 value의 집합
  • 정렬된 중복허용 key 집합
  • 정렬된 중복허용 key와 value의 집합
  1. Container Adaptor(컨테이너 어댑터)
  • 스택
  • <priority_queue> 우선순위 큐

구조

1. Iterator(반복자)

STL전용 포인터, 가리키는 원소에 접근하여 다음 원소를 가리킨다.

2. Algorithm(알고리즘)

정렬, 삭제, 검색, 연산 등을 간단하게 호출하여 구성 가능

3. Allocator(할당기)

컨테이너의 메모리 할당 정책을 캡슐화한 클래스 객체로 모든 컨테이너는 자신만의 할당 크기를 가지고 있다.

4. Function Object(함수 객체)

함수처럼 동작하는 객체, operatior()연산자를 오버 로딩.

5. Adaptor (어댑터)

구성 요소의 인터페이스를 변경하여 새로운 인터페이스를 갖는 구성 요소로 변경.

Class(클래스)

STL의 구조를 좀 더 자세히 알아보기 위하여 클래스를 좀 더 자세히 알아보자.

#include<iostream>
using namespace std;

class Sum{
   int total;  //상태 변수
public:  
   explicit Sum(int n=0) : total(n){} // 생성자
   int operator()(int n) //함수 연산자 오버로딩 -> 클래스를 함수처럼 사용
   {
      return total +=n;
   }
};

int main(){
   Sum sum(0); //total = 0 으로 초기화

   cout << sum(10) << endl;  // total +=10
   cout << sum(100) << endl; // total +=100
   return 0;
}

explicit : 명시적으로 함수를 사용할 수 있도록 함

iterator(반복자)

반복자는 컨테이너에 저장된 원소를 순회하고 접근하는 일반화된 방법을 제공한다.
반복자는 컨테이너와 알고리즘이 하나로 동작하게 묶어주는 인터페이스 역할을 한다.
이 반복자 덕에 알고리즘은 특정 컨테이너에 종속적이지 않고 독립적이면서도 언제든지 컨테이너와 결합하여 동작할 수 있다.

  • 반복자는 컨테이너 내부의 원소(객체)를 가리키고 접근할 수 있어야 한다.(* 연산자)
  • 반복자는 다음 원소로 이동하고 컨테이너의 모든 원소를 순회할 수 있어야 한다.(++, !=, == 연산자 제공)

2020-06-16 updated

C++ 레퍼런스에 가보면 C라이브러리 부터 많은 C++ 라이브러리가 있다. 이 중에 알고리즘에서 꼭 필요한 것들과 알면 좋은 것들을 알아보자.

Containers

  • <array> Array header (header) : vector 로 대체 가능

  • <bitset> Bitset header (header) : 알면 유용함, 잘 쓰지않음

  • <deque> Deque header (header) : 대부분 vector, queue로 해결가능하지만,간혹 양방향 큐가 유용할때가 있다.

  • <forward_list> Forward list (header) : 한번도 써본적이 없다..

  • <List> List header (header): vector 로 대체가능

  • <map> Map header (header) : unordered_map과 자주 쓰인다.

  • <queue> Queue header (header) : 필수!

  • <set> Set header (header) : undredered_set과 자주 쓰인다.

  • <stack> Stack header (header) : vector 로 대체 가능

  • <unordered_map> Unordered map header (header)

  • <unordered_set> Unordered set header (header)

  • <vector> Vector header (header) : 필수!

library

  • <algorithm>Standard Template Library: Algorithms (library) : 필수!

  • <string> Strings (header) : 필수!

  • <tuple> Tuple library (header) : 개인적으로 구조체나 클래스로 선언하여 이용하는게 더 편함.

참조 :
https://boycoding.tistory.com/124
https://codingplus.tistory.com/13
https://modoocode.com/223
http://www.cplusplus.com/reference/

728x90
300x250
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.