1. 程式人生 > >list原始碼3(參考STL原始碼--侯捷):push_front、push_back、erase、pop_front、pop_back、clear、remove、unique

list原始碼3(參考STL原始碼--侯捷):push_front、push_back、erase、pop_front、pop_back、clear、remove、unique

push_front()

//插入一個節點,作為頭結點
void push_front(const T& x){insert(begin(),x);}

push_back()

//插入一個節點,作為尾節點
void push_back(const T &x){insert(end(),x);}

earse

//移除迭代器position所指節點
iterator erase(iterator position){
     link_type next_node=link_type(position.node->next);
     link_type prev_node
=link_type(position.node->prev); prev_node->next=next_node; next_node->prev=prev_node; destory_node(position.node); return iterator(next_node); }

pop_front

//移除頭結點
void pop_front(){erase(begin());}

pop_back

//移除尾節點
void pop_back(){
     iterator temp=end();
     erase(
--temp); }

clear

//清除所有節點
template<class T,class Alloc>
void list<T,Alloc>::clear(){
   link_type cur=(link_type)node->next;//begin()
   while(cur!=node){ //遍歷每一個節點
       link_type temp=cur;
       cur=(link_type)cur->next;
       destory_node(temp);
   }
   //恢復node原始狀態
   node->next=node;
   node
->prev=node; }

remove 

//將數值為value的資料移除
template<class T,class Alloc>
void list<T,Alloc>::remove(const T& value){
     iterator first=begin();
     iterator last=end();
     while(first!=last){ //遍歷整個list
         iterator next=first;
         ++next;
         if(*first==value) earse(first); //移除
         first=next;
    }
}

unique

//移除數值相同的連續元素,注意:“連續相同的元素才會被移除剩下一個
template<class T,class Alloc>
void list<T,Alloc>::unique(){
    iterator first=begin();
    iterator last=end();
    if(first==last) return; //空連結串列
    iterator next=first;
    while(++next!=last){
         if(*first==*next) erase(next); //相同擦除該元素
         else first=next;
         next=first; //修正範圍
    }
}