IT评测·应用市场-qidao123.com技术社区

标题: STL之list [打印本页]

作者: 祗疼妳一个    时间: 2024-9-26 19:44
标题: STL之list
list简单介绍

list与vector的对比

这里不介绍list的利用,因为它和vector大部分的接口是一样的,不了解vector的可以去看
STL之vector
差别点


list的模拟实现

需要的类模板

同意为了减少代码的冗余以是用typedef举行封装
构造与析构

调用接口CreateHead()和push_back()很轻易实现构造
  1. list()
  2.         {
  3.             CreateHead();
  4.         }
  5.         list(int n, const T& value = T())
  6.         {
  7.             CreateHead();
  8.             for (int i = 0; i < n; ++i)
  9.                 push_back(value);
  10.         }
  11. template <class Iterator>
  12.         list(Iterator first, Iterator last)
  13.         {
  14.             CreateHead();
  15.             while (first != last)
  16.             {
  17.                 push_back(*first);
  18.                 ++first;
  19.             }
  20.         }
  21.         list(const list<T>& l)
  22.         {
  23.             CreateHead();
  24.             // 用l中的元素构造临时的temp,然后与当前对象交换
  25.             list<T> temp(l.begin(), l.end());
  26.             this->swap(temp);
  27.         }
  28.         list<T>& operator=(list<T> l)
  29.         {
  30.             this->swap(l);
  31.             return *this;
  32.         }
  33.         ~list()
  34.         {
  35.             clear();
  36.             delete _pHead;
  37.             _pHead = nullptr;
  38.         }
复制代码
迭代器

两种迭代器运用函数的重载即可实现
  1. iterator begin()
  2.         {
  3.             return iterator(_pHead->_pNext);
  4.         }
  5.         iterator end()
  6.         {
  7.             return iterator (_pHead);
  8.         }
  9.         const_iterator begin() const
  10.         {
  11.             return const_iterator ( _pHead->_pNext);
  12.         }
  13.         const_iterator end() const
  14.         {
  15.             return const_iterator (_pHead);
  16.         }
复制代码
容量

  1.   size_t size()const
  2.         {
  3.             PNode cur = _pHead->_pNext;
  4.             size_t count = 0;
  5.             while (cur != _pHead)
  6.             {
  7.                 count++;
  8.                 cur = cur->_pNext;
  9.             }
  10.             return count;
  11.         }
  12.         bool empty()const
  13.         {
  14.             return _pHead->_pNext == _pHead;
  15.         }
复制代码
获取元素

返回相应值即可
  1. T& front()
  2.         {
  3.             return _pHead->_pNext->_val;
  4.         }
  5.         const T& front()const
  6.         {
  7.             return  _pHead->_pNext->_val;
  8.         }
  9.         T& back()
  10.         {
  11.             return _pHead->_pPre->_val;
  12.         }
  13.         const T& back()const
  14.         {
  15.             return _pHead->_pPre->_val;
  16.         }
复制代码
修改

  1. void push_back(const T& val) { insert(end(), val); }
  2.         void pop_back() { erase(--end()); }
  3.         void push_front(const T& val) { insert(begin(), val); }
  4.         void pop_front() { erase(begin());
复制代码
运用迭代器和insert()erase()接口
insert的实现
  1. iterator insert(iterator pos, const T& val)
  2.         {
  3.             Node* pNewNode = new Node(val);
  4.             Node* pCur = pos._pNode;
  5.   
  6.             pNewNode->_pPre = pCur->_pPre;
  7.             pNewNode->_pNext = pCur;
  8.             pNewNode->_pPre->_pNext = pNewNode;
  9.             pCur->_pPre = pNewNode;
  10.             return iterator(pNewNode);
  11.         }
复制代码
起首创建一个的节点Node让它的向前指针指向pos节点的前一个节点,它的向后指针指向pos位置的节点
然后再让pos位置的前一个节点的向后的指针指向新的节点Node,pos位置的向前指针指向新节点Node即可
erase的实现
  1. iterator erase(iterator pos)
  2.         {
  3.             Node* pDel = pos._pNode;
  4.             Node* pRet = pDel->_pNext;
  5.             pDel->_pPre->_pNext = pDel->_pNext;
  6.             pDel->_pNext->_pPre = pDel->_pPre;
  7.             delete pDel;
  8.             return iterator(pRet);
  9.         }
复制代码
起首保存被删除节点的指针用pDel保存,因为erase返回的是被删除节点的下一个节点的迭代器以是我们也要将其保存在pRet中,然后就就简单了,将被删节点的后一个节点的向前指针指向被删节点的前一个节点,将被删节点的前一个节点的向后指针指向被删除指针的反面一个节点即可。
  1. void clear()
  2.         {
  3.             PNode cur = _pHead->_pNext;
  4.             while (cur != _pHead)
  5.             {
  6.                 _pHead->_pNext = cur->_pNext;
  7.                 delete cur;
  8.                 cur = _pHead->_pNext;
  9.             }
  10.             _pHead->_pNext = _pHead->_pPre = _pHead;
  11.         }
  12.         void swap(list<T>& l)
  13.         {
  14.             std::swap(_pHead, l._pHead);
  15.         }
复制代码
clear()遍历list删除即可,swap()用std的swap接口

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4