微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > C++标准库中的list设计

C++标准库中的list设计

时间:12-01 来源:互联网 点击:

urn *this;
}
/*后向++操作符*/
iterator operator++(int)
{
iterator *old = *this;
++(*this);
return old;
}

protected:
/*基于节点的迭代器构造函数*/
iterator(Node *p):const_iterator(p)
{}

friend class List;
};
public:
List()
{
init();
}
~List()
{
clear();
deletehead;
delete tail;
}

List(const List &rhs)
{
/*创建哨兵节点*/
init();
/*复制数据*/
*this = rhs;
}

const List & operator=(const List &rhs)
{
if(this == &rhs)
return *this;
/*清除原有的信息*/
clear();
/*添加新的对象*/
for(const_iterator itr = rhs.begin(); itr != rhs.end(); ++ itr)
push_back(*itr);

return *this;
}

/*得到迭代器,实质上就是得到节点指针*/
iterator begin()
{
/*iterator()是构造函数*/
return iterator(head->next);
}

const_iterator begin()const
{
return const_iterator(head->next);
}

iterator end()
{
return iterator(tail);
}

const_iterator end()const
{
return const_iterator(tail);
}

int size()const
{
return theSize;
}

bool empty()const
{
return size() == 0;
}

void clear()
{
while( !empty())
pop_front();
}

/*得到第一个元素*/
Object & front()
{
/*采用了迭代器begin()*/
return *begin();
}
const Object &front()const
{
return *begin();
}

Object &back()
{
/*end()指向最后一个对象的下一个地址,因此需要--*/
return *--end();
}
const Object &back()const
{
return *--end();
}
/***********************************************
*从头插入新的节点,这时候的begin已经不再是begin
*因此插入操作会导致迭代器出错
***********************************************/
void push_front(const Object &x)
{
insert(begin(), x);
}
/*从后插入新的节点,这时候会将end后移*/
void push_back(const Object &x)
{
insert(end(), x);
}

/*从头弹出一个对象*/
void pop_front()
{
erase(begin());
}
void pop_back()
{
erase(--end());
}

/*插入对象,参数是迭代器和数据*/
iterator insert(iterator itr, const Object &x)
{
/*得到当前迭代器的指针*/
Node *p = itr.current;
theSize ++;

/*
*Node *np = Node(x,p->prev,p);
this means that np->prev = p->prev,
and np->next = p;

update the p->prev and p->prev->next;
*p->prev->next = np;
*p->prev = np;
*/
return iterator(p->prev=p->prev->next= new Node(x,p->prev, p));
}

/*删除迭代器处的对象,因此删除也会导致迭代器破坏*/
iterator erase(iterator itr)
{
/*得到当前迭代器的指针*/
Node *p = itr.current;
/*得到新的迭代器,并初始化*/
iterator retVal(p->next);
/*更新链表的链接关系*/
p->prev->next = p->next;
p->next->prev = p->prev;
/*删除对象*/
delete p;
/*使得对象数减少*/
theSize --;
/*返回新的迭代器*/
return retVal;
}

/*删除迭代器指向的对象*/
iterator erase(iterator start, iterator end)
{
/*for中不使用++itr的原因是erase之后
*就是下一个迭代器,因此不需要++操作*/
for(iterator itr = start; itr != end; )
{
/*该操作会导致迭代器更新到下一个*/
itr = erase(itr);
}
return itr;
}

private:
/*链表中的数据成员*/
int theSize;
Node *head;
Node *tail;
/*初始化函数*/
void init()
{
theSize = 0;
/*create two sentinel node*/
/*构建两个哨兵节点,也就是两个并不算在结构体中的对象*/
head = new Node;
tail = new Node;
/*绑定起来*/
head->next= tail;
tail->prev =head;
}
};
}

#endif

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top