STL은 '표준 C++ 라이브러리'의 일부분으로 '표준 템플릿 라이브러리'를 말합니다. STL은 프로그램에 필요한 '자료구조'와 '알고리즘'을 '템플릿' 형식으로 제공해주는 라이브러리입니다. 해당 포스팅에서는 '배열 기반 시퀀스 컨테이너'에 대해 다룹니다. 

 

먼저 '컨테이너(Container)'의 정의는 다음과 같습니다.

컨테이너: 객체를 저장하는 객체

 

 

정리하면 종류는 다음과 같이 나뉩니다.

 

 

먼저, vector 컨테이너를 예로들면 다음과 같은 모양입니다.

 

vector 컨테이너의 간단한 예제를 살펴보겠습니다

#include <iostream>
#include <vector>
using namespace std;

void main() {
    // int 타입의 값을 저장하는 vector 컨테이너를 생성합니다.
    vector<int> v;
    
    v.push_back(10); // v에 '10'을 추가합니다.
    v.push_back(20); // v에 '20'을 추가합니다.
    v.push_back(30); // v에 '30'을 추가합니다.
    v.push_back(40); // v에 '40'을 추가합니다.
    v.push_back(50); // v에 '50'을 추가합니다.
    
    for (unsigned int i = 0; i < v.size(); ++i)
        cout << v[i] << endl;
}

 

STL에서 가장 많이 쓰이고 대표적인 vector 컨테이너의 생성자와 지원하는 멤버 함수를 자세히 알아보겠습니다. 양이 많아보이지만 기본적인 기능들이 많기 때문에 쉽게 파악하실 수 있습니다. vector 컨테이너를 이렇게 자세히 알아보는 이유는 STL에서 제공하는 다른 컨테이너들도 비슷비슷하기 때문입니다.

생성자
vector v v는 빈 컨테이너입니다.
vector v{ n } v는 기본값으로 초기화된 n개의 원소를 갖습니다.
vector v{ n, x } v는 x값으로 초기화된 n개의 원소를 갖습니다.
vector v{ v2 } v는 v2 컨테이너의 복사본입니다.(복사 생성자 호출)
vector v{ b, e } v는 반복자 구간 [b, e)로 초기화된 원소를 갖습니다.
멤버 함수
v.assign(n, x) v에 x값으로 n개의 원소를 할당합니다.
v.assign(b, e) v를 반복자 구간 [b, e)로 할당합니다.
v.at(i) v의 i번째 원소를 참조합니다.
v.front() v의 첫 번째 원소를 참조합니다.
v.back() v의 마지막 원소를 참조합니다.
v.begin() v의 첫 원소를 가리키는 반복자를 반환합니다.
v.end() v의 끝 원소의 다음을 가리키는 반복자를 반환합니다.
v.size() v의 원소의 개수를 반환합니다.
v.max_size() v가 최대로 담을 수 있는 원소의 개수를 반환합니다.
v.capacity() v에 할당된 공간의 크기를 반환합니다.
v.clear() v의 모든 원소를 제거합니다.
v.empty() v가 비었는지 확인합니다.
v.erase(p) p가 가리키는 원소를 제거한 후, 다음 원소의 위치를 가진 반복자(iterator)를 반환합니다
v.erase(b, e) 반복자 구간 [b, e)의 모든 원소를 제거합니다. 마찬가지로 다음 원소의 위치를 가진 반복자를 반환합니다.
v.insert(p, x) p가 가리키는 위치에 x값을 삽입합니다.
v.insert(p, n, x) p가 가리키는 위치에 n개의 x값을 삽입합니다.
v.insert(p, b, e) p가 가리키는 위치에 반복자 구간 [b, e)의 원소를 삽입합니다.
v.push_back(x) v의 끝에 x를 추가합니다.
v.pop_back() v의 마지막 원소를 제거합니다.
v.swap(v2) v와 v2를 스왑합니다.

 

vector 컨테이너에 대해 알아두어야할 중요한 점으로는, vector 컨테이너는 배열 기반 컨테이너이므로 연속한 메모리를 한 번에 할당합니다. 우리가 이미 알고 있듯이 할당된 배열의 크기를 넘어 원소를 추가하려하면 기존의 할당된 크기보다 더 큰 크기의 배열을 할당한 후 기존 배열의 값을 복사하는 식으로 사용할 수 있습니다. 그리고 vector 컨테이너는 push_back() 멤버 함수를 통해 원소를 계속해서 추가해 나갈 수 있습니다. 원소를 계속 추가해나갈 때, vector 컨테이너는 기존의 할당된 메모리 크기로 부족하다 판단되면 더 큰 크기로 메모리를 재할당한 후 기존에 있던 값은 복사하는 과정을 거칩니다. 이때, 재할당에 드는 성능 문제를 보완하고자 만들어진 개념이 'capacity'입니다. 

 

반복자(iterator)를 사용하여 vector 컨테이너의 원소를 출력하는 예제입니다.

#include <iostream>
#include <vector>
using namespace std;

void main() {
    vector<int> v;
    
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);
    v.push_back(50);
    
    for (auto i = 0; i < v.size(); ++i)
        cout << v[i] << " "; // vector, deque 컨테이너는 [] 연산자를 사용할 수 있습니다.
    cout << endl;
    
    for (auto iter = v.begin(); iter != v.end(); ++iter)
        cout << *iter << " ";
    cout << endl;
}

 

'Programming > C C++' 카테고리의 다른 글

[C++ STL] '연관 컨테이너 - set'  (0) 2019.05.27
[C++ STL] '시퀀스 컨테이너 - list'  (0) 2019.05.27
[C++ 문법] 'friend' 예약어  (0) 2019.05.24
[C++ 문법] '추상 클래스'  (0) 2019.05.24
[C++ 문법] '소멸자 가상화'  (0) 2019.05.24