Standard Template Library 로써, 템플릿으로 구현된 C++ 표준 라이브러리
그중 컨테이너는 프로그래밍에 자주 쓰이는 데이터구조, 즉 데이터를 저장하는 방법들을 템플릿을 이용한 라이브러리로 구현해 놓은것.
컨테이너는
순차적 컨테이너의 특징은 다음과 같다
순차적 컨테이너의 종류는 vector, deque, list 세가지가 있다.
필요에 따라 메모리가 늘어나는 동적 배열의 STL 버전이다.
vector를 사용하려면 다음 헤더파일을 include 해준다.
#include <vector>
vector는 std 네임스페이스에 속해 있으므로 std::vector라고 쓰거나, 네임스페이스를 사용할것이라고 명시해준 후 vector로 쓸 수 있다.
using namespace std;
템플릿으로 구현된 라이브러리이기 때문에 어떤 데이터타입을 쓸지 명시해준다.
vector<int> dynamic_array(6);
위와 같이 코딩하면 int형 변수 6개를 저장할 수 있는 벡터가 만들어진다.
벡터는 배열과 다르게 push_back()함수를 이용하여 맨 뒤에 동적으로 데이터를 추가할 수 있다.
dynamic_array.push_back(9);
데이터에 접근할 수 있는 방법에는 [i]도 있지만,
at(i) 함수를 이용하여 접근이 가능하다.
[i] 연산자와 at(i)의 차이는 at(i)는 인덱스의 범위가 vector의 유효한 데이터 범위에 있는지 먼저 확인을 하고, 인덱스가 범위를 벗어난 경우에는 out_of_range 예외를 던진다.
사용자로부터 인덱스 값을 입력받는다든지 하는 경우에는 at(i)를 써서 데이터에 접근하는것이 좋으며 예외처리를 해주는것이 좋다.
try
{
cout << dynamic_array.at(i) << endl;
}
catch(out_of_range e)
{
cout << "Out of Range" << endl;
}
벡터 크기 관련
v.size() : 실제 원소 수
v.capacity() : 할당된 메모리 크기 (공간 수)
v.reserve(10) : 메모리 공간 크기를 10으로 변경. 늘어난 공간은 비어 있음
v.resize(10) : 메모리 공간 크기를 10으로 변경. 늘어난 공간을 0으로 초기화
vector는 맨 뒤에 데이터르 ㄹ추가하여 한 방향으로 크기를 동적으로 늘릴 수 있었다.
deque는 맨 앞으로도 데이터를 추가하여 양방향으로 크기를 동적으로 느릴 수 있다.
deque<int> double_ended(6);
double_ended.push_back(5);
double_ended.push_front(4);
List는 vector, deque와 달리 배열이 아닌 연결 리스트를 기반으로 구현된 컨테이너이다.
연결 리스트는 데이터가 각각 두개의 포인터를 갖고 있어서 이전 데이터와 다음 데이터가 저장된 위치를 가리키고 있다.
연결 리스트는 배열에 비해 복잡하고 데이터를 저장하는 공간 외에 포인터를 저장하기 위한 공간이 추가로 필요하단ㄴ 단점이 있는 반면, 임의의 위치에 데이터를 끼워 넣거나 삭제하기가 매우 쉽다는 장점이 있다.
stack, queue는 순차적 컨테이너의 일종이다.
스택과 큐는 기존의 컨테이너인 벡터와 데큐에 기반을 두고, 몇 가지 편의를 위한 함수를 추가했다.
이러한것들을 컨테이너 어댑터라고 부른다.
스택은 맨 앞에서만 데이터를 삽입하거나 삭제할 수 있다.
데이터를 삽입할때는 push, 삭제할 때는 pop 함수를 사용하고, 맨 앞의 데이터를 얻고자 할때는 top함수를 사용한다.
큐는 데이터를 맨 뒤에서만 삽입할 수 있고, 맨 앞에서만 삭제할 수 있다. 데이터를 삽입할 때는 push, 삭제할 때는 pop 함수를 사용한다.
맨 앞의 데이터를 얻고자 할때는 front, 맨 뒤의 데이터를 얻고자 할때는 back 함수를 사용한다. 그 위에 empty 함수를 호출하여 큐가 비었는지 확인할 수 있고, size 함수를 호출하여 큐에 저장된 데이터의 개수를 알 수 있다.
string은 문자열을 저장하기 위한 클래스로서 vector와 구조는 비슷한 일종의 순차적 컨테이너다.