이번 장에서는 STL 컨테이너 중 시퀀스 컨테이너에 대하 알아보도록 하겠습니다.

STL 컨테이너는 시퀀스 컨테이너와 연관 컨테이너로 나눌 수 있습니다.

시퀀스 컨테이너 : 저장 원소가 삽입 순서에 따라 상대적인 위치를 갖는 컨테이너 (vector, list, deque)

연관 컨테이너 : 특정 정렬 규칙에 따라 상대적인 위치를 갖는 컨테이너(set, map, multiset, multimap)


먼저 시퀀스 컨테이너 중 하나인 vector컨테니어 에 대해 알아 보도록 하겠습니다.

vector 컨테이너는 배열과 비슷하여 사용이 쉽고 자주 사용되므로 잘 익혀 두시기 바랍니다.

<vector의 구조>

vector는 원소의 저장 위치가 정해지며 배열 기반 컨테이너이므로 원소가 하나의 메모리 블록에 할당된다.

시퀀스 컨테이너는 차례차례 원소를 추가하고 제거하는 push_back( )과 pop_back( )을 가지며, 첫 원소와 마지막 원소를 참조하는 front()와 back()을 가집니다. 또한 지정한 위치에 원소를 삽입할 수 있는 insert()를 가집니다. 반면 다른 시퀀스와 다르게 앞쪽에는 원소를 추가/제거할 수 없으며 뒤쪽에만 추가/제거할 수 있습니다.(다른 시퀀스 컨테이너는 앞쪽에도 추가/제거할 수 있습니다.)


그럼 예제를 통해 이해해 보도록 하겠습니다.

<vector의 push_back( )>

-> v라는 vector컨테이너를 만들고 끝부분에 10, 20, 30, 40, 50을 추가하고 출력해주는 예제입니다. 쉽죠? ㅎ

<vector의 size(), capacity(), max_size()

-> size() : 저장 원소의 개수

-> capacity() : 실제 할당된 메모리 공간

-> max_size() : 컨테이너에 담을 수 있는 최대 원소의 개수

그렇다면 결과는 어떻게 될까요??

 size()와 max_size()는 모든 컨테이너가 가지는 멤버 함수입니다. 하지만, capacity()는 유일하게 vector만이 가지는 멤버 함수입니다.

vector 컨테이너는 배열 기반 컨테이너이므로 연속한 메모리를 한 번에 할당하지만, 계속 원소가 추가될 수 있습니다. 원소가 추가될 때마다 메모리를 재할당하고 이전 원소를 모두 복사해야 한다면 너무나 비효율적일 것입니다. 따라서 재할당에 드는 성능 문제를 보완하고자 만들어지 개념이 capacity입니다. capacity()를 예제를 통해 좀 더 쉽게 이해해 보도록 하겠습니다.

<vector의 capacity()>

->결과를 보면 미리 저장할 메모리의 크기를 크게 하면 원소가 추가돼도 메모리의 크기가 변하지 않게 됩니다.

->또한 미리 메모리를 예약할 수 있는 reserve()를 제공합니다. ex) v.reserve(8) // 8만큰의 메모리 할당

<vector 생성자의 초기값 지정>

1. vector<int> v(5)  : 기본값 0으로 초기화된 size가 5인 컨테이너

2. vector<int> v(5,1) : 기본값 1로 초기화된 size가 5인 컨테이너

3. vector<int> v(v1) : v는 v2컨테이너의 복사본 컨테이너


<vector의 clear( )와 empty( )>

->v.clear() : v를 비운다.

->v.empty() : v가 비었는지 검사한다.

@

->결과를 보시면 size는 0이 되어도 메모리는 제거되지 않고 남아 있게 됩니다.

->swap방법을 이용하여 capacity를 0으로 만들수 있습니다.


<swap을 이용한 할당 메모리 제거>

@

-> 이렇게 swap을 이용하니 할당 메모리를 제거할 수 있내요~


vector 컨테이너의 남은 내용은 다음시간에 이어서 하도록 하겠습니다. ^^




<작성자 - CODER_CJH>

<참고자료 - 뇌를 자극하는 C++STL>





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

8. vector 컨테이너(2)  (0) 2016.06.03
6. 템플릿  (0) 2016.06.01
5.함수 객체  (0) 2016.06.01
4. 함수 포인터  (1) 2016.06.01
3. STL에 필요한 주요 연산자 오버로딩(2)  (4) 2016.06.01

+ Recent posts