반응형

cpp list class

리스트는 순서있는 컨테이너. 어느 위치라도 추가/삭제가 용이함. 더블 링크드 리스트로 구현.

#include <list>


+constructor

-empty container constructor

list(const allocator_type& alloc=allocator_type()) ;

-fill constructor

list(size_type n, const value_type& val, const allocator_type& alloc =allocator_type())

-range constructor

list(inputiterator first, last, alloc=allocator_type()) ;

-copy const.

list(const list& x, alloc=null) ;

-move const.

list(list &&x, alloc=null) ;

-initializer list const.

list(initializer_list<value_type> il, alloc=allocator_type()) ;


std::list<int> first ;

std::list<int> second (4, 100) ;    // 4개, 100의 값으로 채움.

std::list<int> third( second.begin(), second.end() ) ;

std::list<int> fourth (third ) ;

int arr1[]={1,2,3,4} ;

std::list<int> fifth( arr1, arr1+sizeof(arr1)/sizeof(int) ) ;


+일반적인 메소드

size() ; 요소 개수

back(), front() ; 마지막, 처음 원소 값.

begin(), end() ; iterator, 앞에 c를 붙이면 const type.

rbegin(), rend() ; reverse iterator, 앞에 c를 붙이면 const.

insert()

erase()


+수정

push_back(), pop_back()

push_front(), pop_front() ; 앞에서 추가할 수도 있다. (벡터는 앞에 추가하려면 .insert( .begin() , ..)을 사용해야 한다. )

emplace(), emplace_back(), emplace_front()

std::list< std::pair<int, char> > mylist ;

mylist.emplace_back( 10, 'a') ;

mylist.emplace_front( 20, 'b') ;

mylist.emplace( mylist.begin(), 100, 'x') ;

for (auto &x : mylist)  std::cout << x.first << ":" << x.second <<  "\n" ;

+reverse()

순서를 뒤집는다.


+sort()

정렬 ; 파라미터를 주지 않으면 디폴트로 오름차순 정렬된다.


bool compare_nocase(const std::string &first, const std::string &second) {

unsigned int i=0; 

while ( (i<first.length()) && (i<second.length()) ) {

  if ( tolower(first[i]) < tolower(second[i])) return true ;

  else if ( tolower(first[i]) > tolower(second[i]) ) return false ;

  ++i ;

}

return ( first.length() < second.length() ) ;

}

mylist.sort( compare_nocase ) ;



+unique()

중복 값을 가진 노드들을 제거한다.

mylist.sort() ;

mylist.unique() ;

mylist 출력 : 중복된 값들이 제거되고 오름차순으로 출력됨. 


중복의 범위를 정하는 함수 사용.

struct is_near { 

  bool operator() (double first, double second) {  return  (fabs(first-second) < 5.0 ) ; } 

} ;

mylist.unique( is_near() ) ; // 5.0 미만의 차이는 중복으로 보고 중복 제거한다. 


+=operator

내용을 모두 복사함.


+assign()

할당. 새로운 리스트의 내용으로 덮어쓴다. 

assign( inputiterator first, last)

assign(size_type n , const value_type &val) ;

assign( initializer_list<value_type> il) ;

std::list<int> first ;

first.assign(7, 100) ;    // 7개를 100으로 채움.

second.assign( first.begin(), first.end() ) ;


+ remove() ;특정 값을 찾아 요소를 삭제한다.

remove( const value_type & val) ;

erase()는 위치를 파라미터로 주고 삭제하는 것이고, remove()는 값을 찾아 삭제해 준다.


+remove_if() ; 조건에 따른 삭제.

struct is_odd {

bool operator() ( const int&value ) {  return (value%2)==1; } 

} ;

mylist.remove_if(is_odd()) ;        // 홀수를 제거한다.



+splice() ; 리스트를 다른 리스트로 이동. (copy가 아님)

-전체 ; splice( const_iterator position, list &x) ;

    splice(const_iterator position, list && x) ;

-한 개 ; splice( position, list &x, const_iterator i) ;

-범위 ; splice( position, x, first, last) ;

x에서 지정된 위치의 범위를 지정된 위치로 전송/삽입한다.

mylist = 1,2,3,4

mylist2 = 10,20,30

it = mylist.begin()+1 ;

mylist1.splice(it, mylist2) ;    // 1 10 20 30 2 3 4 , mylist2는  empty가 된다. (전송되었으므로.) 위에서 지정한 it는 여전히 2를 가리키므로 위치가 begin()+4 위치로 된다. 

mylist2.splice(mylist2.begin(), mylist1, it) ; // mylist2=2  ,   mylist=1 10 20 30 3 4 (2가 이동됨.)

it = mylist.begin()+3 ;

mylist.splice( mylist.begin(), mylist, it, mylist1.end() ) ; // 30 3 4 1 10 20


+merge() ; 병합. x의 데이터가 transfer 이동 됨.  splice()와 비슷하나 순서에 맞게 들어간다.

merge(list& x) ;

merge(list &x, Compare comp) ;

first.sort() ;

second.sort() ;

first.merge(second) ;    // second는 empty가 된다. second의 요소들이 first에 순서에 맞게 전부 추가됨.

first.merge(second, mycomparison) ;

bool mycomparison(double first, double second) {  return ( int(first) < int(second)) ; }














'Develop > C&CPP' 카테고리의 다른 글

string  (0) 2018.05.30
map  (0) 2018.05.29
Array 1  (0) 2018.05.25
Vector 3  (0) 2018.05.23
Vector 2  (0) 2018.05.18

+ Recent posts