언어 자료구조 알고리즘/Escort 자료구조와 STL

[자료구조와 STL] 1. STL 소개

언제나휴일 2016. 4. 18. 09:42
반응형

1. 들어가기에 앞서

 

1.1 STL 소개

 

 STL(Standard Template Library, 표준 템플릿 라이브러리)은 개체들을 보관하기 위한 다양한 컨테이너와 이들 컨테이너에 보관된 개체들을 반복적으로 순회할 수 있게 해 주는 반복자, 사용자에서 정의한 코드를 입력 인자로 전달받아 처리할 수 있게 추상화한 함수 개체, 다양한 문제 해결 방법이 구현된 함수들로 구성된 알고리즘 등으로 구성되어 있습니다.

 

 이 책에서는 STL에 제공되는 일부 컨테이너와 반복자, 함수 개체 및 알고리즘을 소개하는 동시에 기본적인 자료구조에 대한 개념과 구현 방법을 전달할 것입니다. 자료구조를 다루는 수많은 책에서는 한정된 형식의 자료를 보관하는 형태의 예를 들고 있는 것과는 달리 이 책에서는 STL에 제공하는 것처럼 설계와 구현을 함으로써 어떠한 형식이라도 보관할 수 있게 할 것입니다. 이를 통해 여러분은 자료구조뿐만 아니라 C++의 템플릿에 관한 문법을 비교적 충분히 학습할 기회가 생길 것이며 STL에서 제공하는 것들에 대한 설계구조와 구현 능력 및 기본적인 사용방법을 익힐 수 있을 것입니다.

 

 개정된 STL에서는 namespace std 에 정의되어 있기 때문에 해당 namespace를 사용하겠다는 표시를 하여야 합니다. (이 책은 C++ 문법에 대한 기본적인 학습을 한 이들을 위함을 명시하는 바입니다.)

 

using namespace std;

using std::[사용할이름];

 

 STL에서 제공하는 컨테이너 종류에는 선형 자료구조인 vector list, 선형 자료구조를 특정 목적에 맞게 변형한 stack, queue, priority_queue가 있으며 자료를 비선형으로 보관하는 set, multiset, map, multimap, hash_map, 기타 컨테이너로 bitset, valarray 등을 제공하고 있습니다. 이 외에도 map이나 multimap에서 사용되는 단순히 키와 값의 쌍으로 구성된 pair를 제공합니다.

 

 STL에서 제공되는 각 컨테이너는 별도의 헤더 파일을 포함하여 사용할 수 있게 되어 있으며 일반적으로 사용하려는 컨테이너 이름과 헤더 파일명은 일치합니다.

 

#include <vector>

using std::vector;

 

 이번 장에서 설명하는 예제 코드들은 이 책에서 다루는 내용을 미리 보여주는 것일 뿐 어떠한 문법 사항이나 코드에 대한 설명을 위한 것이 아닙니다.

 

 STL에서 제공하는 반복자는 컨테이너의 종류에 상관없이 컨테이너의 특정 구간에 보관된 개체들에 대해 차례대로 같은 방법으로 작업할 때 사용합니다. 실제 각 컨테이너의 자료를 보관하는 구조에 따라 각 반복자의 구현은 다르게 정의되어 있지만 같은 방법으로 사용할 수 있습니다. 그리고 반복자의 간접 연산을 하면 컨테이너에 보관한 원소 형식으로 캐스팅됩니다. 하지만 반복자를 얻어온 후에 원소를 추가하거나 삭제하면 컨테이너 구조가 바뀌어 기존에 얻어온 반복자는 의미가 없게 됩니다. 다음은 반복자를 이용하는 예제 코드입니다.

 

vector<int> vi;

... 중략...

vector<int>::iterator seek = vi.begin();

vector<int>::iterator end = vi.end();

for(  ; seek != end ; ++seek)

{

    cout<<*seek<<endl;

}

 

list<int> li;

... 중략...

list <int>::iterator seek = li.begin();

list<int>::iterator end = li.end();

for(  ; seek != end ; ++seek)

{

    cout<<*seek<<endl;

}

 

 STL에서는 다양한 알고리즘을 라이브러리화하여 제공하고 있습니다. 그리고 일부 알고리즘을 사용자가 결정해야 할 때 함수 개체를 이용할 수 있습니다. 예를 들어, 학생 관리 프로그램에서 학생 이름순으로 정렬할 것인지 번호 순으로 정렬할 것인지에 따라 비교하는 구문은 달라질 수 있는데 이 경우에 비교하는 부분에 대한 알고리즘을 구현하여 이를 정렬을 수행하는 함수에 입력 인자로 전달하면 됩니다.

 

bool Compare(Stu *s,Stu *b)

{

    return s->GetNum()<b->GetNum();

}

vector<Stu *> stues(100);

sort(stues.begin(), stues.end(),Compare);

 

 경우에 따라 함수 개체는 함수 호출 연산자를 중복 정의한 형식의 개체일 수도 있는데 이에 대한 부분은 앞으로 진행하면서 소개를 하기로 하겠습니다.

 

 STL에서 제공되는 알고리즘은 다양한 정렬 알고리즘, 검색 알고리즘뿐만이 아니라 수치 해석, 통계와 같은 특수한 목적을 위한 것들도 많습니다. 이 책에서는 컨테이너를 중심으로 반복자와 함수 개체 및 알고리즘을 소개하고 설계 및 구현 방법을 전달할 것입니다.

 

 결국, 이 책은 STL에서 제공되는 다양한 형태의 라이브러리를 개괄적으로 소개하거나 자료구조의 개념을 전달하는 책이 아닙니다. 이 책에서는 STL에서 제공되는 다양한 자료구조와 이와 관련된 것들이 어떠한 구조로 만들어져 있는지를 살펴보고 비슷하게 만들어 보는 과정을 통해 자료구조를 이해를 도와줄 것입니다. 물론, 이 책을 통해 여러분은 STL에서 자주 사용되는 컨테이너나 반복자 및 함수 개체와 관련 알고리즘을 사용하는 방법을 익힐 수 있습니다. 하지만 단순히 STL을 사용하는 방법에 대해서만 다루고 있지 않기 때문에 세부적인 사항까지 알고 사용하기 위해서는 별도의 학습이 필요할 수 있습니다.

반응형