list原始碼3(參考STL原始碼--侯捷):push_front、push_back、erase、pop_front、pop_back、clear、remove、unique
阿新 • • 發佈:2018-11-02
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; //修正範圍
}
}