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') ;
+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)) ; }