C++ STL;Standard template library in C

sunghoon·2025년 3월 21일
0

2.0 Glove Project

목록 보기
25/35

STL의 개념

코드 개발 초기에는 어려운 코드가 미덕인 시절이 있었다.
강사님께서 잊혀지지 않는 코드로 모나리자를 그림을 그렸던 mi친 작품..
세기말이 끝나고 프로젝트가 커지고 표준화에 대한 요구가 커졌다.

  • 배경
    • CRT(C Runtime Library)라는 이름의 라이브러리를, C++ Standard Library를 가지고 있다.
    • 각 언어는 기능을 제공하고 손쉽게 구현하며, 재사용을 하기 위한 목적이다.
    • 1994년 7월 C++ 표준 라이브러리에 STL(Standard Template Library)이 추가되었다.
  • 정의
    • 템플릿의 철학은 누구나 공통적으로 사용하기 위한 일반화 프로그래밍(Generic Programming)을 기반으로 한다.
    • 무분별한 여러 형태의 코드를 지양하고 표준화된 코드를 지향한다.
  • 성능
    • 전반적으로 성능면에서 라이브러리에 비해 전혀 떨어지지 않는다.
    • 각 자료구조마다 사용 용도에 따른 성능의 차이를 보이는데, 자료의 검색, 정렬 삭제에 최적화된 자료

STL 구성요소

컨테이너 정의

container는 용기를 의미한다.

배열처럼 동일한 요소들로 구성되어야한다.

2kind : Sequence Container, Sorted Associactive container

Sequence Container; 순차 컨테이너

동일한 객체가 선형으로 구성된 집합

대표적으로 3가지의 종류가 있다.

vector

vec·tor ˈvektər

  1. a course to be taken by an aircraft.
  2. an organism, typically a biting insect or tick, that transmits a pathogen, disease, or parasite from one animal or plant to another.
  3. a quantity having direction as well as magnitude, especially as determining the position of one point in space relative to another.

구성 요소에 임의 접근이 가능하다. 요소 끝에 삽입/삭제는 빠르지만 처음이나 중간 삽입/삭제는 요소 개수에 따라 처리속도가 비례한다.

deque

  • 벡터와 비슷하다. 차이점은 요소 양끝에 삽입/삭제가 가능하다는 점이다. 성능 또한 벡터와 같이 요소 개수에 따라 처리속도가 비례한다.

list

  • 구성 요소에 선형적으로 접근한다. 요소에 삽입과 삭제가 위치에 상관없이 같은 속도로 처리한다.

Sorted Associactive container

Map

집합에 키와 데이터를 같이 관리하는데, 키의 중복은 허용하지 않으므로, 동일한 키가 2개 존재할 수 없으며, 키를 사용하는 원하는 객체를 빠르게 찾아간다.

iterator 반복자

iterate: perform or utter repeatedly.

컨테이너의 요소를 가리키는 객체로 컨테이너의 시작부터 끝까지 이동하면서 요소를 읽거나 쓰기 위해 사용

Algorithm

STL은 이미 완성된 알고리즘 제공되어 사용하면 된다.

알고리즘은 모두 일반적이므로 여러 컨테이너에서 사용할 수 있다.

STL의 특징

장점

  • 일반화 지원
  • 컴파일 타입의 매커니즘 사용 ⇒ 실행 시, 효율 저하 적다
  • 이식성
  • 소스 공개 ⇒ 확장성

단점

  • 템플릿 기반 ⇒ 함수, 클래스 구체화 ⇒ 소스 길어짐
  • 낮은 가독성
  • 예외 처리 어려움

Container

Vector

image.png

일반화된 컨테이너 중에서 가장 많이 사용된다.

필요한 크기만큼 메모리를 자동으로 재할당하여 늘릴 수 있다.

템플릿 기반으로 요소 타입에 무관하게 만들 수 있다.

C언어의 realloc()을 통해 재할당되는 구조

사용형태

// 벡터 형식(Class)으로 타입이 T형인 객체를 선언한 형태
vector<T> vec1;
// 타입이 int형인 벡터를 생성
vector<int> vec1;
#include <iostream>
#include <vector>

using namespace std;

void main()
{
    // 벡터의 크기를 미리 지정할 수도 있다.
    vector<int> vec1(5);
    // 크기를 5로 지정하였지만, 동적 메모리이므로 필요한 만큼 메모리를 늘릴 수 있다.

}

Push_back

queue 구조의 enqueue

뒤쪽에 공간을 미리 만들고 데이터를 추가

뒤쪽에 추가하기 때문에 접근 속도 일정하고 빠름

앞쪽에 추가한다면..

군대 행군에서 산을 넘어감 앞사람 속도 맞춰야 함
교통 정체와 유사

deque

image.png

정의

양쪽 끝에서 데이터를 사업 및

사용형태

deque<T> dq
#include <iostream>
#include <deque>

using namespace std;

int main()
{
    // int num = 0;
    // cin >> num;
    deque<int> dq;
    
    {
    for(int i = 0; i < 5; i++) 
        dq.push_back((i + 1) * 10);
    }
    for(int i = 0; i < 5; i++) 
    {
        cout << dq[i] << endl;
    }

    return 0;
}

deque 함수

  • .size(): 크기 출력

list

image.png

정의

리스트는 배열 처럼 사용되지만 내부구조는 완전히 다른 형태

리스트는 이중 연결 리스트로 구현되어 있는 컨테이너이다.

연결 리스트는 노드라는 것이 붙어 있어서 데이터가 물리적으로 인접해있지 않고, 논리적인 순서를 기억하므로 데이터 삽입, 삭제의 속도가 상대적으로 빠르다.

사용 형태

리스트는 인덱스로 연결되어 있지 않기 때문에 iterator(반복자)를 사용해야한다.

list<int>::iterator it;

begin(): 리스트 첫번째 위치의 포인터 값을 넘겨준다.

end()가장 끝 요소의 다음 번째 메모리 위치

list<int>::iterator it;

for(it = lst.begin(); it != lst.end(); it++) {
  cout << *it << endl;
}

JS → for each()와 유사한 개념

profile
프라다 신은 빈지노와 쿠페를 타는 꿈을 꿨다.

0개의 댓글