본문 바로가기

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

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

◎ 링크 재배치
 - 리스트에는 링크 재치의 장점을 살리수 있는 여러가지 함수가 준비되어 있다.

 
 ㅇ void swap(list& Right);

    - 실제 요소를 교환할 필요 없이 리스트끼리 head, tail 정보만 바꾼다.  ==> 속도 상승





ㅇ void reverse()
  - 요소들을 꺼구로 재배치하여 일일 옮길 필요없이 next, prev 링크를 반대로 바꾼다.
 
 ㅇ void merge(list& Right)
  - 리스트끼리 병합하는 merge는 링크를 조작하여 한쪽 리스트를 다른쪽의 끝과 연결한다

※ swap, reverse, merge 이 함수는 일반함수로도 제공되지만, 멤버함수로 제공되는 이유는 리스트의 특성을 이용하여 하기때문에 일반함수보다 훨씬 빠르다.


ㅇ splice 함수
  - splice 의미 : 새끼줄 같은 것을 꼬아서 서로 잇는다.
  - 두 개의 리스트를 서로 잇거나 한쪽 요소들을 뽑아서 다른 쪽으로 이동시킨다.
  - void splice(iterator it, list& x);      :  it위치에 list x를 이동, 호출 객체가 자신이면 X
  - void splice(iterator it, list& x, iterator first);   : it 위치에 list의 first만 이동시킴(요소 하나만), 호출 객체가 자신이어도 허용
  - void splice(iterator it, list& x, iterator first, iterator last);     : 범위 안에 있는 것을 이동, 호출 객체가 자신이어도 허용

 - splice 예제
1 #include <iostream>
2 #include <list>
3 using namespace std;
4
5 template <typename C>
6 void dump(const char *desc, C c) 7 {
8     cout.width(12);
9     cout << left << desc << "==> " ;
10     copy(c.begin(), c.end(), ostream_iterator<typename C::value_type>(cout," "));
11     cout << endl;
12 }
13
14 void main()
15 {
16     const char *alpha = "abcdefghij";
17     const char *num = "12345";
18     list<char> la(&alpha[0], &alpha[10]);
19     list<char> ln(&num[0], &num[5]);
20     list<char>::iterator ita, it1, it2;
21
22     dump("알파벳", la);
23     dump("숫자", ln);
24     ita = la.begin();
25     ita++;
26     ita++;
27
28     it1 = ln.begin();
29     it1++;
30     it1++;
31
32     it2 = ln.end();
33     it2--;
34     it2--;
35
36     /// 전체이동
37     la.splice(ita, ln);
38
39     ///앞쪽2번쨰만이동
40     //la.splice(ita, ln, it1);
41
42     // 구간이동
43     //la.splice(ita,ln, ln.begin(), ln.end() );
44
45     dump("알파벳", la);
46     dump("숫자", ln);
47
48
49 }



- 전체이동

 

- 구간이동




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