list中的接口有sort(默認是按照由小到大的順序排,可以更改排序方式,也可排完后調用reverse()逆置)
模擬實現(xiàn)list即將list中的函數(shù)模擬實現(xiàn),同樣也分為五部分:構造與析構、容量、迭代器、元素訪問、元素修改。
需要注意的問題是list中的迭代器,與vector中不同的是list不是順序結構,所以我們要對迭代器進行封裝,其使用規(guī)則也要在這個封裝中自定義給出。vector中的使用原生態(tài)指針即可。
代碼如下:
#include<iostream>
using namespace std;
namespace mine//自己定義的命名空間,為了防止與庫中的list沖突
{
template <class T>//定義了一個節(jié)點類
class ListNode
{
public:
ListNode(const T &data=T())//沒有傳參的話調用T類型對象的默認構造函數(shù)
:_pPre(nullptr)
, _pNext(nullptr)
, _data(data)
{
}
ListNode<T>*_pPre;
ListNode<T>*_pNext;
T _data;
};
template<class T>
class Iterator
{
public:
typedef ListNode<T> Node;//對節(jié)點類重命名,方便后面的使用
typedef Iterator<T> Self;
Iterator(Node *cur)//構造函數(shù)
:_pCur(cur)
{
}
T& operator *()//按照指針的方式進行引用
{
return _pCur->_data;
}
T *operator ->()
{
return &(_pCur->_data);
}
Self& operator++()//前置++
{
_pCur = _pCur->_pNext;
return *this;
}
Self& operator++(int)//后置++
{
Self tmp(*this);
_pCur = _pCur->_pNext;
return *tmp;
}
Self& operator--()//前置--
{
_pCur = _pCur->_pPre;
return *this;
}
Self &operator--(int)//后置--
{
Self tmp(*this);
_pCur = _pCur->_pPre;
return *tmp;
}
bool operator ==(const Self & l)
{
if (l._pCur==_pCur)
{
return true;
}
return false;
}
bool operator !=(const Self & l)
{
return !(_pCur == l._pCur);
}
Node * _pCur;
};
template <class T>//list類
class list
{
public:
typedef ListNode<T> Node;
typedef Iterator<T> iterator;
public:
//////////////////////////////////////////////////////////////
//構造與析構
typedef ListNode<T> Node;//對節(jié)點類型重命名,使用起來更加方便
list()//默認構造函數(shù),只創(chuàng)建一個頭節(jié)點
{
CreatHead();
}
list(int n, const T& val)//構造n個值為val
{
CreatHead();
for (int i=0; i < n; i++)
{
push_back(val);
}
}
template<class iterator>
list(iterator first, iterator end)//區(qū)間構造
{
CreatHead();
while (first != end)
{
push_back(*first);
first++;
}
}
list(const list<T> &L)//拷貝構造
{
CreatHead();
Node*cur = L._phead->_pNext;
while (cur != L._phead)
{
push_back(cur->_data);
cur = cur->_pNext;
}
}
list <T>& operator=(const list<T> & l)//賦值運算符的重載
{
if (&l != this)
{
clear();
Node*cur = l._phead->_pNext;
while (cur != l._phead)
{
push_back(cur->_data);
cur = cur->_pNext;
}
}
return *this;
}
~list()
{
clear();
delete _phead;
}
//////////////////////////////////////////////////////////////
//迭代器
iterator begin()
{
return iterator(_phead->_pNext);
}
iterator end()
{
return iterator(_phead);
}
//////////////////////////////////////////////////////////////
//容量
int size()
{
int size = 0;
Node*cur = _phead->_pNext;
while (cur != _phead)
{
size++;
cur = cur->_pNext;
}
return size;
}
bool empty()
{
if (_phead->_pNext == _phead)
{
return true;
}
return false;
}
void resize(int newsize, const T&data = T())
{
int oldsize = size();
if (newsize > oldsize)
{
for (int i = oldsize; i < newsize; i++)
{
push_back(data);
}
else
{
for (int i = newsize; i < oldsize; i++)
{
pop_back();
}
}
}
}
///////////////////////////////
// 元素訪問
T& front()
{
return _pHead->_pNext->_data;
}
const T& front()const
{
return _pHead->_pNext->_data;
}
T& back()
{
return _pHead->_pPre->_data;
}
const T& back()const
{
return _pHead->_pPre->_data;
}
//////////////////////////////////////////////////////////////
//元素修改
void push_back(const T& data)
{
insert(end(), data);
}
void pop_back()
{
erase(--end());
}
iterator insert(iterator pos,const T& data)
{
Node*cur = new Node(data);
Node*tmp = pos._pCur;
cur->_pNext = tmp;
cur->_pPre = tmp->_pPre;
cur->_pPre->_pNext = cur;
tmp->_pPre = cur;
return iterator(cur);
}
iterator erase(iterator pos)
{
Node*del = pos._pCur;
if (del == _phead)
{
return end();
}
Node *ret = del->_pNext;
del->_pPre->_pNext = del->_pNext;
del->_pNext->_pPre = del->_pPre;
delete del;
return iterator(ret);
}
void clear()//頭刪
{
Node *cur = _phead->_pNext;
while (cur != _phead)
{
_phead->_pNext = cur->_pNext;
delete cur;
cur = _phead->_pNext;
}
_phead->_pNext = _phead;
_phead->_pPre = _phead;
}
private:
void CreatHead()
{
_phead = new Node;
_phead->_pPre = _phead;
_phead->_pNext = _phead;
}
private:
Node* _phead;
};
};
int main()
{
mine::list<int> l(5,10);
mine::list<int> s(l);
for (auto e : s)
{
cout << e;
}
system("pause");
return 0;
}
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
分享名稱:模擬實現(xiàn)stl中的list-創(chuàng)新互聯(lián)
分享地址:http://aaarwkj.com/article48/csochp.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站內鏈、微信小程序、企業(yè)網站制作、企業(yè)建站、用戶體驗、靜態(tài)網站
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)