시퀀스 컨테이너 : 저장 원소가 삽입 순서에 따라 상대적인 위치를 갖는 컨테이너 (vector, list, deque)
연관 컨테이너 : 특정 정렬 규칙에 따라 상대적인 위치를 갖는 컨테이너(set, map, multiset, multimap)
먼저 시퀀스 컨테이너 중 하나인 vector컨테니어 에 대해 알아 보도록 하겠습니다.
vector 컨테이너는 배열과 비슷하여 사용이 쉽고 자주 사용되므로 잘 익혀 두시기 바랍니다.
<vector의 구조>
vector는 원소의 저장 위치가 정해지며 배열 기반 컨테이너이므로 원소가 하나의 메모리 블록에 할당된다.
시퀀스 컨테이너는 차례차례 원소를 추가하고 제거하는 push_back( )과 pop_back( )을 가지며, 첫 원소와 마지막 원소를 참조하는 front()와 back()을 가집니다. 또한 지정한 위치에 원소를 삽입할 수 있는 insert()를 가집니다. 반면 다른 시퀀스와 다르게 앞쪽에는 원소를 추가/제거할 수 없으며 뒤쪽에만 추가/제거할 수 있습니다.(다른 시퀀스 컨테이너는 앞쪽에도 추가/제거할 수 있습니다.)
size()와 max_size()는 모든 컨테이너가 가지는 멤버 함수입니다. 하지만, capacity()는 유일하게 vector만이 가지는 멤버 함수입니다.
vector 컨테이너는 배열 기반 컨테이너이므로 연속한 메모리를 한 번에 할당하지만, 계속 원소가 추가될 수 있습니다. 원소가 추가될 때마다 메모리를 재할당하고 이전 원소를 모두 복사해야 한다면 너무나 비효율적일 것입니다. 따라서 재할당에 드는 성능 문제를 보완하고자 만들어지 개념이 capacity입니다. capacity()를 예제를 통해 좀 더 쉽게 이해해 보도록 하겠습니다.
<vector의 capacity()>
@
->결과를 보면 미리 저장할 메모리의 크기를 크게 하면 원소가 추가돼도 메모리의 크기가 변하지 않게 됩니다.
->또한 미리 메모리를 예약할 수 있는 reserve()를 제공합니다. ex) v.reserve(8) // 8만큰의 메모리 할당
템플릿은 컴파일 타임에 클라이언트가 여러 타입의 함수나 클래스를 쉽게 생성하게 하고, 서버 코드 작성자는 좀더 일반적인 프로그램 코드를 만들고 클라이언트가 구체적인 코드를 작성함으로써 제너릭한 프로그래밍이 가능하게 합니다.
템플릿에는 함수 템플릿과 클래스 템플릿이 있습니다.
템플릿의 강력한 기능을 설명하기 위해 간단한 예제를 살펴보겠습니다.
위 예제는 간단하게 정수를 출력하는 예제입니다. 만약 여기에 실수와 문자열을 출력하는 두 함수를 추가 하려고 한다면 함수 오버로딩을 이용하면 됩니다. 그러나 함수 오버로딩은 클라이언트가 매개변수 타입을 미리 알고 있다는 전제로 만들어집니다. 만일 클라이언트에서 사용자 정의 타입을 결정해야 한다면 함수 오버로딩으로 해결할 수 없습니다. 그러나 템플릿을 이용하면 이 문제를 간단하게 해결할 수 있습니다.
위의 정수 출력 예제를 템플릿을 사용하여 사음과 같이 변형할 수 있습니다.
매우 유용한 기능이내요 ㅎ
연습 예제로 swap() 함수를 템프릿 버전으로 만들어 보겠습니다.
다음은 클래스 템플릿에 대해 알아보도록 하겠습니다.
클래스 템플릿은 함수 템플릿과 별반 다르지 않습니다. 단지 함수에서 클래스로 바뀐 것뿐입니다.
예제를 통해 알아보도록 하겠습니다.
아래 소스는 장수 자료를 저장,관리하는 Array 클래스입니다.
이렇게 정의하게 되면 여러가지 타입의 Array클래스의 객체를 사용할수 있게 됩니다.
후~ 드디어 STL에 들어가기전 기본 문법에 대해서 알아보았내요.
다음시간에는 STL에 대해서 알아 보도록 하겠습니다.
연산자오버로딩, 함수포인터, 함수객체, 템플릿에 대하여 숙지하지 못하신분들은 꼭 다시 둘러보고 STL에 들어가도록 합시다!!