C++ STL


표준 템플릿 라이브러리(STL, Standard Template Library)은 C++의 중요한 구성 요소로, 다양한 데이터 구조와 알고리즘을 제공하는 템플릿화된 컨테이너와 함수들의 모음입니다. STL은 C++ 표준 라이브러리의 일부로 제공되며, 많은 편리한 기능들을 제공합니다. 여기에는 주요 컴포넌트들이 포함되어 있습니다:

주요 컴포넌트

  1. 컨테이너 (Containers)
    • 시퀀스 컨테이너 (Sequence Containers): 벡터(vector), 리스트(list), 덱(deque), 배열(array), 큐(queue), 스택(stack) 등이 포함됩니다.
    • 연관 컨테이너 (Associative Containers): 세트(set), 멀티세트(multiset), 맵(map), 멀티맵(multimap) 등이 있습니다.
  2. 반복자 (Iterators)
    • 입력 반복자 (Input Iterators): 읽기만 가능한 반복자입니다.
    • 출력 반복자 (Output Iterators): 쓰기만 가능한 반복자입니다.
    • 전방향 반복자 (Forward Iterators): 읽기와 쓰기 모두 가능하지만 한 번만 전진할 수 있는 반복자입니다.
    • 양방향 반복자 (Bidirectional Iterators): 전진과 후진이 모두 가능한 반복자입니다.
    • 임의 접근 반복자 (Random Access Iterators): 임의의 위치로 접근이 가능한 반복자입니다.
  3. 알고리즘 (Algorithms)STL은 다양한 알고리즘을 제공합니다. 예를 들어 정렬(sort), 검색(search), 변형(transform), 집계(accumulate) 등의 알고리즘이 있습니다.
  4. 함수 객체 (Function Objects, Functors)함수 객체는 함수처럼 동작하는 객체로, STL의 알고리즘과 함께 사용됩니다. 주로 operator() 멤버 함수를 오버로딩하여 사용합니다.
  5. 할당기 (Allocators)메모리 할당과 관련된 정책을 지정하는 객체로, 컨테이너에서 사용됩니다.

컨테이너(Container)

벡터(Vector)

  • 동적 배열을 구현한 컨테이너입니다.
  • 요소들이 메모리에 연속적으로 저장되며, 임의 접근 반복자(random access iterator)를 제공하여 요소에 빠르게 접근할 수 있습니다.
#include <vector>
#include <iostream>

int main() {
    // 정수를 저장하는 벡터 생성
    std::vector<int> vec;

    // 벡터에 요소 추가
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);

    // 벡터 순회 및 출력
    for (auto it = vec.begin(); it != vec.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

리스트(List)

  • 이중 연결 리스트를 구현한 컨테이너입니다.
  • 임의 위치에서 삽입과 삭제가 빠르며, 순차적 접근만 가능합니다.
#include <list>
#include <iostream>

int main() {
    // 정수를 저장하는 리스트 생성
    std::list<int> lst;

    // 리스트에 요소 추가
    lst.push_back(1);
    lst.push_back(2);
    lst.push_back(3);

    // 리스트 순회 및 출력
    for (auto it = lst.begin(); it != lst.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

덱(Deque)

  • 더블 엔디드 큐(Double-ended Queue)를 구현한 컨테이너입니다.
  • 벡터와 비슷하지만 양쪽 끝에서 삽입과 삭제가 빠릅니다.
#include <deque>
#include <iostream>

int main() {
    // 정수를 저장하는 덱 생성
    std::deque<int> deq;

    // 덱에 요소 추가
    deq.push_back(1);
    deq.push_back(2);
    deq.push_front(3);

    // 덱 순회 및 출력
    for (auto it = deq.begin(); it != deq.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

스택(Stack)

  • 후입선출(LIFO, Last In First Out) 원칙에 따라 요소를 관리하는 컨테이너입니다.
  • 요소의 삽입은 push, 삭제는 pop으로 이루어집니다.
#include <stack>
#include <iostream>

int main() {
    // 정수를 저장하는 스택 생성
    std::stack<int> stk;

    // 스택에 요소 추가
    stk.push(1);
    stk.push(2);
    stk.push(3);

    // 스택 순회 및 출력
    while (!stk.empty()) {
        std::cout << stk.top() << " ";
        stk.pop();
    }
    std::cout << std::endl;

    return 0;
}

큐(Queue)

  • 선입선출(FIFO, First In First Out) 원칙에 따라 요소를 관리하는 컨테이너입니다.
  • 요소의 삽입은 push, 삭제는 pop으로 이루어집니다.
#include <queue>
#include <iostream>

int main() {
    // 정수를 저장하는 큐 생성
    std::queue<int> que;

    // 큐에 요소 추가
    que.push(1);
    que.push(2);
    que.push(3);

    // 큐 순회 및 출력
    while (!que.empty()) {
        std::cout << que.front() << " ";
        que.pop();
    }
    std::cout << std::endl;

    return 0;
}

우선순위 큐(Priority Queue)

  • 우선순위에 따라 요소를 관리하는 큐입니다.
  • 디폴트로는 요소가 큰 순서대로 정렬되며, std::less를 사용하여 작은 요소가 우선순위를 갖도록 할 수 있습니다.
#include <queue>
#include <iostream>

int main() {
    // 정수를 저장하는 우선순위 큐 생성
    std::priority_queue<int, std::vector<int>, std::less<int>> pq;

    // 우선순위 큐에 요소 추가
    pq.push(3);
    pq.push(1);
    pq.push(2);

    // 우선순위 큐 순회 및 출력
    while (!pq.empty()) {
        std::cout << pq.top() << " ";
        pq.pop();
    }
    std::cout << std::endl;

    return 0;
}

연관 컨테이너(Associative Containers)

맵(Map) 및 멀티맵(Multimap)

  • 키-값 쌍으로 데이터를 관리하는 컨테이너입니다. 맵은 중복된 키를 허용하지 않지만, 멀티맵은 중복된 키를 허용합니다.
#include <map>
#include <iostream>

int main() {
    // 문자열을 키로, 정수를 값으로 갖는 맵 생성
    std::map<std::string, int> m;

    // 맵에 요소 추가
    m["one"] = 1;
    m["two"] = 2;
    m["three"] = 3;

    // 맵 순회 및 출력
    for (auto it = m.begin(); it != m.end(); ++it) {
        std::cout << it->first << ":" << it->second << " ";
    }
    std::cout << std::endl;

    return 0;
}

셋(Set) 및 멀티셋(Multiset)

  • 정렬된 중복을 허용하지 않는 요소들의 집합을 관리하는 컨테이너입니다. 셋은 중복된 요소를 허용하지 않지만, 멀티셋은 중복된 요소를 허용합니다.
#include <set>
#include <iostream>

int main() {
    // 정수를 저장하는 셋 생성
    std::set<int> s;

    // 셋에 요소 추가
    s.insert(3);
    s.insert(1);
    s.insert(2);

    // 셋 순회 및 출력
    for (auto it = s.begin(); it != s.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

알고리즘(Algorithms)

STL은 다양한 알고리즘을 제공하여 컨테이너에서 데이터를 처리하고 정렬하는 등의 작업을 할 수 있습니다. 여기에는 std::sort, std::find, std::transform 등이 포함됩니다.

#include <algorithm>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec = {3, 1, 4, 1, 5, 9, 2, 6, 5};

    // 벡터 정렬
    std::sort(vec.begin(), vec.end());

    // 벡터 출력
    std::cout << "정렬된 벡터: ";
    for (auto it = vec.begin(); it != vec.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    // 특정 값 찾기
    int key =

 5;
    auto result = std::find(vec.begin(), vec.end(), key);
    if (result != vec.end()) {
        std::cout << key << "가 벡터에 있습니다." << std::endl;
    } else {
        std::cout << key << "가 벡터에 없습니다." << std::endl;
    }

    return 0;
}

STL은 C++ 프로그래밍에서 매우 유용한 도구로, 코드의 재사용성과 유지 보수성을 높여줍니다. 다양한 템플릿화된 구조체와 함수들을 이용하여 복잡한 데이터 처리와 알고리즘 작업을 간편하게 할 수 있습니다.


Leave a Reply

Your email address will not be published. Required fields are marked *