C C++ - STL2014. 2. 13. 12:27
[STL-7]Sequence Container(순차 컨테이너)|STL을 배우자
2004.05.26 23:31

Sequence Container로 분류되는 Vector, Deque, List에 대하여 간단한 예를 보고 어떤 자료구조 인지 보도록 하겠습니다. 각각에 대한 자세한 라이브러리 함수와 활용은 따로 예를 들어 보도록하구요. 이번에는 단순히 선언 하는 것과 각각의 Container의 차이를 보도록 하겠습니다.

 

 1  #include <iostream>
 2  #include <string>
 3  #include <vector>
 4  #include <deque>
 5  #include <list>
 6  #include <algorithm>         //copy
 7  #include <cstdlib>           //EXIT_SUCCESS
 8  #include <iomanip>           //setw , left
 9
10  using namespace std;
11
12  //컨테이너 내용을 출력합니다.
13  //여러 타입에 사용할 수 있게 제너릭 형태로 하였습니다.
14  template<class T>
15  void CtnPrnElm(string str, const T& data);
16
17  int main(int argc, char **argv)
18  {
19      // 컨테이너에 넣을 문자열입니다.
20      string S="0123456789";
21      size_t i, S_size=S.size();
22
23      // 순차 컨테이너를 char type으로 만듭니다.
24      vector<char> V;
25      deque<char> D;
26      list<char> L;
27
28      // 각각의 컨테이너에 string의 문자 하나씩 넣습니다.
29      for(i=0;i<S_size;++i){
30          V.push_back(S[i]);   // 뒤로 자료를 추가 합니다.
31          D.push_front(S[i]);  // 앞과 뒤로 자료를 추가 합니다.
32          D.push_back(S[i]);
33          L.push_back(S[i]);   // 뒤로 자료를 추가합니다.
34      }
35
36      // 각각의 컨테이너 내용을 출력합니다.
37      CtnPrnElm("Vector",V);
38      CtnPrnElm("Deque",D);
39      CtnPrnElm("List",L);
40
41      return EXIT_SUCCESS;
42  }
43
44  template<class T>
45  inline void CtnPrnElm(string str, const T& data)
46  {
47      cout << ' ' << setw(8) << left << str << ": ";
48      copy(data.begin(),data.end(),ostream_iterator<char>(cout," "));
49      cout << endl;
50  }

result:

---------------------------------------

 Vector   : 0 1 2 3 4 5 6 7 8 9 
 Deque   : 9 8 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 8 9 
 List       : 0 1 2 3 4 5 6 7 8 9
 

 

Sequence Container의 경우는 generic algorithm을 이용하여 모두 처리할 수 있어서 상호 데이타를 복사/교환 하는 것도 가능합니다.

자료 구조가 어떠하든 모든 Container는 아무곳에나 자료를 넣고 삭제할 수 있게 라이브러리 알고리즘과 제너릭 알고리즘에서 remove, delete, insert 등의 함수를 사용할 수 있으며 iterator을 적적하게 잘 사용하면 기교 있는 코딩이 가능합니다.

 

Sequence Container는 거의 같은 형태로 움직이며 각각의 자료구조상의 장단점이 있습니다. 물론 내부구조는 상당히 다른 형태를 가지고 있지만 interface는 상당히 비슷합니다. 그래서 어떤 하나의 컨테이너에 대한 사용법을 알면 동일한 맴버 함수이름으로 사용할 수 있습니다.

 

vector는 뒤에 자료를 추가할 경우 빠르지만 중간에 넣고자 할 때는 list에 비해 상당히 느립니다.

deque는 vector와 비슷한 장단점을 가지지만 가장 큰차이는 앞 뒤로 자료를 추가 할 수 있다는 것입니다. list의 경우는 중간에 추가 삭제가 vector나 deque에 비해 상당히 좋은 성능을 가지지만 자료를 찾거나 sort등 random access를 할 경우에는 효율이 많이 떨어집니다. 아래 자료 구조 그림을 보시면 더 이해 하기가 쉬울 듯 합니다.

 


vector

deque

deque

list
 
 
어떤 컨테이너를 쓰느냐는 상황에 따라 결정 할 수 밖에 없습니다. 일반적으로 수치 계산등은 자료를 넣고 sort하거나 순차 연산이나 자료 찾기(random access)가 많은 경우는 vector이나 deque로 쓰기에 좋으며 자료의 추가 삭제가 많은 경우는 list가 좋습니다.
 
다음에는 vector 라이브러 함수를 보도록 하겠습니다.


'C C++ - STL' 카테고리의 다른 글

STL - 9 find, find_if  (0) 2014.02.13
STL - 8 Vector 라이브러리  (0) 2014.02.13
STL - 6 알고리즘  (0) 2014.02.13
STL - 5 Text Picture  (0) 2014.02.13
STL - 4 Iterator 반복자  (0) 2014.02.13
Posted by violetoz