본문 바로가기

[ C/ C++ 프로그래밍 ]/[ STL ]

[ 혼연 정리 ] 시퀀스 컨테이너- 6 [ 리스트 ]


◎ 리스트
 
 - 이중 연결 리스트를 탬플릿으로 추상화한 버전
 - 동일한 자료의 집합을 관리
 - 용도면에서 벡터와 같고 서로 대체 가능 ==> 주요 멤버함수의 원형 일치, 대입,비교등의 연산자도 동일
 - 리스트의 반복자는 링크를 가리키는 포인터 ( 벡터의 반복자는 요소를 직접 가리키는 포인터)
 
ㅇ 벡터와 리스트의 주요 차이점
 ① 반족자의 레벨 (가장 큰차이점) => 리스트 양방향, 벡터는 임의 접근
    - []연산자, at함수, sort, binary_search 사용 X

 ② 링크만 조작해서 삽입, 삭제 수행
   -  제일 앞에 요소 삽입, 삭제하는 push_front, pop_front 제공
   - capacity, reserve 불필요 -> 크기를 처음부터 정할 필요 없음

 ③ 링크 구조로 인해 메모리 소모량은 벡터 보다 훨씬 많다.
   - 노드는 무조건 동적할당, 요소간의 순서를 기억하기 위한 링크도 별로의 메모리를 소모,
   - 삽입,삭제시 마다 노드를 할당, 해제하는 과정을 반복하므로 메모리 단편화 심함 ==> 시스템의 메모리 관리 능력에도 좋지 않은 영향

 ④ 삽입,삭제에 의해 요소들의 물리적인 위치가 바뀌지 않으므로 반복자의 무효화는 되지 않음
  -  무효화가는 되는 경우는 반복자가 가리키는 대상을 삭제 했을 경우(완전히 사라졌을경우)

 
※ 벡터는 읽기에 강하고, 리스트는 쓰기에 강함, 읽기 속도는 벡터, 삽입,삭제는 리스트가 더 좋다.


ㅇ 생성자

  - explicit list();      /// 디폴트 생성자
  - explicit list(size_type n, const T& v = T() )       /// v값 n개를 가지는 생성자
  - list(const list& x);     /// 복사 생성자
  - list(const_iterator first, const_iterator last); /// 구간 복사 생성자

 ※ 할당기는 원형에서 생략, 리스트는 실행중 크기를 얼마든지 늘릴수 있음으로 통상적으로 빈 리스트(디폴트)를 생성함

  - list 예)

1 #include <iostream>
2 #include <list>
3 using namespace std;
4
5
6 void main()
7 {
8     /// 디폴드생성자생성
9     list<int> li;
10
11     list<int>::iterator it;
12
13     li.push_back(8);
14     li.push_back(9);
15 li.push_front(7);
16     li.push_front(6);
17
18     for ( it = li.begin() ; it != li.end() ; it++)
19         printf("%d \n",*it);
20
21 }




ps : 출처 및 자세한 내용은  www.WinAPI.co.kr 참고