zero_stone 2021. 9. 10. 17:54

-list란?

  노드들이 포인터를 통해 서로 양방향 포인터로 연결된 형태의 자료구조이다.

  검색 시간은 오래걸리지만 삽입,삭제는 빠르다는 장점을 갖고 있다.

   

-헤더파일

#include<list>

 

-생성

  1)default 생성자: 

     list<data_type> li;  

     비어있는 list를 생성 

 

 2) 크기 지정 생성자:

    list<data_type> li(4);

    노드수가 4인 vector 생성  원소들은 0으로 초기화 된다.

 

 3)크기와 초기화 쌍 생성자:

    list<data_type> li (4,100);

 

    노드수가 4이며 모두 100으로 초기화     

 

 4) 다른 list의 원하는 범위 지정 생성자:

    list<data_type> li(first_iterator , last_iterator);

    다른 list의 복사 하기를 원하는 시작 위치와 끝 위치의 다음 iterator를 매개변수로 전달하여 li에 복사

 

 5) 다른 vector 통째로 복사시키는 생성자 

    list<data_type> li (a);

 

    list a를 그대로 li에 복사 

        

-함수

1)begin(): 

시간복잡도:O(1)

시작 위치를 가리키는 정방향 iterator 반환

 

2)end(): 

시간복잡도:O(1)

마지막 요소 다음 위치(맨 마지막 요소 다음)를 가리키는 정방향iterator 반환

 

3)rbegin(): 

시간복잡도:O(1)

끝 요소를 가리키는 역방향 iterator 반환

 

4)rend():

시간복잡도:O(1)

시작 요소 전 위치를 가리키는 역방향 iterator 반환 

 

*정방향 iterator와 역방향 iterator의 차이를 모른다면 여기로https://zero-stone.tistory.com/22

 

 

5)assign()

시간복잡도:O(N)

기존 list의 원소들을 새로운 원소들로 대체한다.

2가지 유형이 존재

첫번째> void assign (원소갯수, 초기값)

두번째> void assign ( first_iterator, last_iterator) 

      *frist_iterator, last_iterator은 포인터도 가능

6)back():

시간복잡도:O(1)   

가장 맨 뒤에있는 (참조)값을 리턴

7)front(): 

시간복잡도:O(1)

가장 맨 앞에있는 (참조)값을 리턴

8) clear(): 

시간복잡도:O(N)

list에 있는 모든 노드 삭제

9)size():

list에 저장된 노드 갯수 리턴

 

10) empty():

시간복잡도:O(1)

 list가 비어있으면 1을 리턴 아니면 0을 리턴

 

11)max_size():

  시간복잡도:O(N)

    int max_size()

    list가 가질 수 있는 최대 노드수 리턴

 

12)erase:

시간복잡도:O(N)

원하는 위치의 iterator를 매개변수로 넘겨주면 해당 위치 요소 제거한다.

중간 값을 없애도 자동적으로 list를 조절해 연결 구조를 유지한다.

  *2가지 유형

    ->첫번째= iterator erase(iterator)    iterator가 가리키는 위치 원속 삭제 

    ->두번째= iterator erase(iterator first , iterator last)   first~last직전원속들 삭제 

        삭제된 노드의 전방 노드 iterator를 반환

13) remove:

    시간복잡도:O(N)    

    void remove ( type value)

    list내 value를 값으로 갖는 노드를 모두 삭제

 

14) remove_if:

    시간복잡도:O(N)    

    void remove_if (함수명)

    list내 조건을 만족하는 노드를 모두 삭제

    함수 true 를 반환 하는 조건에 해당하는 노드를 모두 제거

    

참조)https://www.cplusplus.com/reference/list/list/remove_if/

13) insert(3가지 유형):

      매개변수로 전달한 iterator 위치 전방에 노드를 삽입

      시간복잡도=O(N)

       첫번째> iterator insert (iterator position , type& val)  

                   position위치에 val을 값으로하는 노드 삽입

                   ex) v.insert( it , 5 );

       

        두번째> void insert (iterator position , int n , type& val)

                   position위치에서 부터 n개의 val을 값으로 하는 노드 삽입

                   ex) v.insert( it , 10 , "abc" );

       

        세번째> void insert (iterator position , iterator first , iterator last) 

                   position위치에서 부터 first~last이전 노드들을 삽입

                   ex) v.insert( it , it_1 , it_2 );

 

                   *first와 last위치에는 포인터도 가능.

      

14) push_back & push_front:  

     시간복잡도=O(1)

      void push_back (type value);

      void push_front (type value);

      list 맨뒤(앞)에 노드 추가

 

       

15) pop_back & push_front:

      시간복잡도=O(1)

      void pop_back();

      void pop_front();

      list 맨뒤(앞) 노드 삭제

      

 

16) reverse:

    시간복잡도=O(N)

    void reverse()

    list를 순서를 반전시킨다.

    1->2->3 순이였다면

    3->2->1 순으로 

17) resize:

     시간복잡도=O(N)

     void resize ( int n , type value)

     list의 크기를 n으로 만든다.

     만약 n이 현재 size보다 작으면 n+1번째 노드부터는 없앤다.

     n이 현재 size보다 크면 value부분을 생략한 경우 n-size개를 0을 값으로 갖는 노드로 채우고

     value를 지정해주면 해당 n-size개를 value로 값으로 갖는 노드로 채운다.

     ( 2번째 매개변수는 생략 가능) 

 

18) merge:

    시간복잡도=O(N)

    void merge (list &x, Compare comp);

    정렬된 2개의 list를 병합하는 함수이다.

     (정렬 안돼있으면 에러리턴, Compare comp는 비교함수 생략시 오름차순)

      

 

19) sort:

   시간복잡도: O(N logN)

   void sort( 함수명)

   함수가 true를 리턴하는 조건에 따라서 정렬한다.

   

결과:

5

3

1

   

19) splice:

    void splice (iterator position , list& x , iterator first , iterator last);

 

    첫번째> void splice ( position , x)  시간복잡도=O(옮기는 수)

       li.splice(it ,x)

       li의 it위치서 부터 x의 모든 노드를 옮긴다. x의 모든 노드는 삭제된다.

     

 

    두번째> void splice ( position , x , it)  시간복잡도=O(옮기는 수)

            li.splice( it , x , it_1)

            x에서 it_1위치 부터 쭉 li의 it위치에서 부터 쭉 옮긴다. x의 it위치 부터 쭉 삭제 

 

    세번째> void splice ( position, x, first ,last) 시간복잡도=O(N)

           x의 first~last이전 것들 옮기고 삭제

 

 

20) unique:

 시간복잡도=O(N)

 -void unique()  

 -void unique( 함수명) 

  list내  중복된 value를 제거한다.

  매개변수로 함수를 전달하면 해당 조건을 만족하는 노드들에만 적용한다.