日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

[C++STL]C++实现list容器

發布時間:2023/12/4 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [C++STL]C++实现list容器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

代碼如下:

#pragma once #include <iostream> using namespace std;template<typename T> struct ListNode {T _data;ListNode<T> *_next;ListNode<T> *_prev;ListNode(const T & val = T()) :_data(val), _next(nullptr), _prev(nullptr) {}; };//template<typename T> //struct ListIterator //{ // typedef ListNode<T> Node; // typedef ListIterator<T> Self; // Node *_node; // // ListIterator(Node * node = nullptr) :_node(node) {} // // // //但是該操作并不方便,通過解引用再獲取對象值。 // /*以上的操作支持內置類型的基本操作,但是并不能滿足當結點存儲的內置類型的操作, // 當對對象解引用時,是返回的結點的_data,但是這個_data是一個對象, // 也就并非能得到內置類型的值。*it得到的是對象,再通過.來獲得對象的屬性值。 // 例如: // struct A // { // int _a; // A(int a = 0):_a(a){} // }; // // 使用時: // List<A> lst; // List<A>::iterator it = lst.begin(); // cout<<(*it)._a<<endl; // // */ // T &operator*() // { // return _node->_data; // } // // // //在STL庫中的迭代器可以直接通過->_a來獲取,迭代器是一個對象, // //怎么可以通過->來獲取自定義類型的屬性呢?我們就必須重載->來實現。 // //就是it->獲得自定義類型對象的地址, // //再通過->就可以獲得自定義類型對象的指定的值it->->_a // // 只是在C++會進行優化,省略了其中的一個->。 // // 下面是實現第一個->的代碼 例如: List<A> lst; List<A>::iterator it = lst.begin(); cout << it->_a << endl; // // // T *operator->() // { // return &(_node->_data) // } // // Self & operator++() // { // _node = _node->_next; // return *this; // } // // Self operator++(int) // { // Self tmp(_node); // _node = _node->_next; // return tmp; // } // // Self &operator--() // { // _node = _node->prev; // return *this; // } // // Self operator--(int) // { // Self tmp(_node); // _node = _node->prev; // return tmp; // } // // bool operator ==(const Self &s) // { // return _node == s._node; // } // // bool operator!=(const Self &s) // { // return _node != s._node; // } //};//template<typename T> //struct ConstListIterator //{ // typedef ListNode<T> Node; // typedef ConstListIterator<T> Self; // Node * _node; // ConstListIterator(Node *node = nullptr) :_node(node) {} // // ConstListIterator(const Self &s):node(s._node){} // // Self & operator++() // { // _node = _node->_next; // return *this; // } // // Self operator++(int) // { // Self tmp(_node); // _node = _node->_next; // return tmp; // } // // Self &operator--() // { // _node = _node->prev; // return *this; // } // // Self operator--(int) // { // Self tmp(_node); // _node = _node->prev; // return tmp; // } // // bool operator ==(const Self &s) // { // return _node == s._node; // } // // bool operator!=(const Self &s) // { // return _node != s._node; // } // // const T&operator*() // { // return _node->_data; // } // // const T*operator->() // { // return &(_node->_data); // } // //};//上面是iterator 和 const_iterator 的分開實現, //但是STL庫中實現并不是這樣子的,我們發現兩個迭代器類型只是類中兩個成員函數的返回值不一樣而已。 //其他代碼邏輯都是一樣的,所以我們可以通過多加兩個模板類型來解決這個問題,讓他們成為一個類,只是類型有所差別。 //在原來的迭代器中將模板改為template<class T, class Ref, class Ptr> T為普通類型,Ref為引用類型,Ptr為指針類型。template<typename T, typename Ref, typename Ptr> struct ListIterator {typedef ListNode<T> Node;typedef ListIterator<T, Ref, Ptr> Self;Node *_node;ListIterator(Node *node = nullptr) :_node(node) {}ListIterator(const Self &s) : _node(s._node) {}Self & operator++(){_node = _node->_next;return *this;}Self operator++(int){Self tmp(_node);_node = _node->_next;return tmp;}Self &operator--(){_node = _node->_prev;return *this;}Self operator--(int){Self tmp(*this);_node = _node->_prev;return tmp;}Ref operator*(){return _node->_data;}Ptr operator->(){return &(_node->_data);}bool operator!=(const Self &s){return _node != s._node;}bool operator==(const Self &s){return _node == s._node;} };template<typename T> class List { public:typedef ListNode<T> Node;typedef ListIterator<T, T &, T *> iterator;typedef ListIterator<T, const T&, const T*> const_iterator;/*typedef ListIterator<T> iterator;iterator begin(){return iterator(_header->_next);}iterator end(){return iterator(_header);}typedef ConstListIterator<T> const_iterator;const_iterator cbegin() const{return const_iterator(_header->_next);}const_iterator cend() const{return const_iterator(_header);}*///上面是由于iterator 和 const_iterator 的分開實現,所以要這樣寫。//下面是iterator 和 const_iterator 合在一起后的寫法。iterator begin(){return iterator(_header->_next);}iterator end(){return iterator(_header);}const_iterator cbegin() const{return const_iterator(_header->_next);}const_iterator cend() const{return const_iterator(_header);}List() :_header(new Node()){_header->_next = _header->_prev = _header;}List(int n, const T&val = T()) :_header(new Node()){_header->_next = _header->_prev = _header;for (size_t i = 0; i < n; i++){push_back(val);}}template<typename inputIterator>List(inputIterator first, inputIterator last) :_header(new Node()){_header->_next = _header->_prev = _header;while (first != last){push_back(*first);++first;}}//拷貝構造函數,現代寫法List(List<T> &l) :_header(new Node()){_header->_next = _header->_prev = _header;List<T> tmp(l.begin(), l.end());swap(tmp);}//交換兩個對象的頭結點void swap(List<T> &l){Node *tmp = l._header;l._header = this->_header;this->_header = tmp;}/*利用了拷貝構造函數創建新空間,然后再交換他們的頭結點,tmp離開函數就會自動釋放了*/List<T> &operator = (List<T> tmp){swap(tmp);return *this;}void push_back(const T &val){Node *tail = _header->_prev;Node *newNode = new Node(val);tail->_next = newNode;newNode->_prev = tail;newNode->_next = _header;_header->_prev = newNode;}void clear(){if (_header != nullptr){Node *cur = _header->_next;while (cur != _header){Node *next = cur->_next;delete[] cur;cur = nullptr;cur = next;}}}size_t size() const{int sz = 0;Node *cur = _header->_next;while (cur != _header){++sz;cur = cur->_next;}return sz;}iterator erase(iterator pos){if (pos != end()){Node *next = pos._node->_next;Node *prev = pos._node->_prev;prev->_next = next;next->_prev = prev;delete[] pos._node;return iterator(next);}return pos;}void insert(iterator pos, const T &val){Node * newNode = new Node(val);Node *prev = pos._node->_prev;Node *cur = pos._node;prev->_next = newNode;newNode->_prev = prev;newNode->_next = cur;cur->_prev = newNode;}void push_front(const T& val){insert(begin(), val);}void pop_back(){erase(--end());}void pop_front(){erase(begin());}~List(){clear();delete _header;_header = nullptr;} private:Node *_header; };template<typename T> void PrintFor(List<T> &lst) {for (auto &e : lst){cout << e << " ";}cout << endl; }

測試代碼如下:

#include <iostream> #include "List.h" using namespace std;struct A {int _a;A(int a = 0) :_a(a) {}; };int main() {List<int> lst;List<int> lst2(3, 1);string str = "12345";List<char> lst3(str.begin(), str.end());lst.push_back(1);lst.push_back(2);lst.push_back(3);lst.push_back(4);List<int>::iterator it = lst.begin();while (it != lst.end()){cout << *it << " ";++it;}cout << endl;List<A> lst4;lst4.push_back(1);lst4.push_back(2);lst4.push_back(3);lst4.push_back(4);List<A>::iterator it1 = lst4.begin();while (it1 != lst4.end()){cout << it1->_a << " ";++it1;}cout << endl;PrintFor(lst2);List<int> lst5;lst5.push_back(1);lst5.push_back(2);lst5.push_back(3);lst5.push_back(4);lst5.push_back(5);List<int>::iterator it2 = lst5.begin();while (it2 != lst5.end()){if (*it2 % 2 == 0) it2 = lst5.erase(it2);else ++it2;}PrintFor(lst5);return 0; }

測試結果:

總結

以上是生活随笔為你收集整理的[C++STL]C++实现list容器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲成网站| www.色图 | 青青草免费看 | 成人做受视频试看60秒 | 国产在线视频91 | 日韩精品一区二区在线看 | 亚洲精品高清无码视频 | 性久久久久久久久久久 | 青青视频在线播放 | 色性网站 | 欧洲精品视频在线观看 | 国产人妻一区二区三区四区五区六 | 国产91美女视频 | 91精选| 午夜国产 | 久久久.www | 欧美视频91 | 97超碰人人爱 | 国产精品大屁股白浆一区 | 99久久人妻精品免费二区 | 特黄在线 | 色婷婷综合视频 | 精品国产三级 | 国产精品第四页 | 欧洲xxxxx | 成人网免费视频 | 雪花飘电影在线观看免费高清 | 亚洲人久久 | www国产精品内射老熟女 | av超碰| 一区二区三区啪啪啪 | jzz国产 | www.久久久久久久 | 色吊丝av中文字幕 | 欧美日韩tv| 久久国产网 | jzzijzzij亚洲成熟少妇在线播放 狠狠躁日日躁夜夜躁2022麻豆 | 在线亚洲天堂 | 精品免费囯产一区二区三区 | 国产男女猛烈无遮挡免费视频 | 国产婷婷色 | 自拍偷拍第5页 | 久久22| 老头老太做爰xxx视频 | 成人国产毛片 | aaaa黄色 | 你懂的网址在线 | 人人免费操 | 一区二区三区在线观看 | 一级片久久久久 | 毛片精品| 午夜8888 | 日本综合久久 | 夜夜久久| 麻豆影视国产在线观看 | 欧美xxxx×黑人性爽 | 好吊日av | 欧美日韩一区二区电影 | 波多野吉衣视频在线观看 | 在线免费观看视频你懂的 | 国产精品毛片一区视频播 | 91欧美一区二区三区 | 国产成人在线播放视频 | 永久免费毛片 | 亚洲欧美成人一区二区 | 成人做爰www免费看视频网站 | 91大神在线观看视频 | 久久青青视频 | 欧美怡红院一区二区三区 | 永久免费网站直接看 | 日本美女视频 | 天天摸天天 | 草草影院av | 男人天堂网在线视频 | 免费看麻豆 | 亚洲精品激情视频 | 男人天堂最新网址 | 成年人性生活免费视频 | 久在线播放 | 秋霞网一区二区 | 亚洲AV成人无码久久 | www.麻豆av.com| 久操超碰 | 久爱视频在线观看 | 黄网站色视频免费观看 | 日韩成人av网站 | 激情三区| 神马久久精品 | 黑人巨茎大战欧美白妇 | 欧美日韩免费观看视频 | av资源中文在线 | 日韩一级片在线播放 | 高清乱码免费 | 日本网站在线免费观看 | av在线综合网 | 欧美黑人又粗又大高潮喷水 | 美日韩黄色片 | 久久久久久久久久久久久av | 深夜视频在线免费观看 |