list的設計

#pragma once
#include<assert.h>
#include<iostream>
using namespace std;
namespace aqc
{template<class T>struct list_node{list_node* _next;list_node* _prev;T _data;list_node(const T& x=T())//加const防止權限放大,用引用減少拷貝:_next(nullptr),_prev(nullptr),_data(x){}};template<class T,class Ref,class Ptr>struct __list_iterator{typedef list_node<T> node;typedef __list_iterator<T, Ref, Ptr> self;node* _node;__list_iterator(node*  tmp)//BUG--函數名報錯:_node(tmp){}Ref operator*()//返回值引用或const引用,不能構成重載,不好辦了//,因此傳第二個模板參數,在創建迭代器時確定返回的是什么{return _node->_data;}Ptr operator->()//同上,有T*和const T*{return &(_node->_data);}self& operator++(){this->_node = _node->_next;return *this;}self operator++(int){self tmp(*this);//生成默認淺拷貝構造_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& x)const{return _node != x._node;}bool operator==(const self& x){return _node == x._node;}};template<class Iterator,class Ref,class Ptr>struct ReverseIterator{typedef ReverseIterator<Iterator, Ref, Ptr> self;Iterator _cur;ReverseIterator(Iterator it):_cur(it){}Ref operator*()//為了保持對稱的形態,rbegin對end,rend對begin,解引用時要調整一下{Iterator tmp=_cur;--tmp;return *tmp;}Ptr operator->(){return &(_cur._node->_data);}self& operator++(){--_cur;return *this;}self operator++(int){self tmp = *this;--_cur;return tmp;}self operator--(){++_cur;return *this;}bool operator!=(const self& x)const{return _cur != x._cur;}};template<class T>class list{typedef list_node<T> node;public:typedef __list_iterator<T, T&, T*> iterator;typedef __list_iterator<T, const T&, const T*> const_iterator;typedef  ReverseIterator< iterator, T&, T*> reverse_iterator;typedef  ReverseIterator<const_iterator, const T&, const T*> const_reverse_iterator;iterator begin(){return iterator(_head->_next);}const_iterator begin()const//不論普通鏈表還是const鏈表都可使用const迭代器{return const_iterator(_head->_next);}iterator end(){return iterator(_head);}const_iterator end()const{return const_iterator(_head);}reverse_iterator rbegin(){return reverse_iterator(end());}reverse_iterator rend(){return reverse_iterator(begin());}void empty_init(){_head = new node;_head->_next = _head;_head->_prev = _head;}list(){empty_init();}template<class Iterator >list(Iterator first, Iterator last){empty_init();while (first != last){push_back(*first);first++;}}void swap(list<T>& lt){std::swap(_head, lt._head);}list(list<T>& lt){empty_init();list<T> tmp(lt.begin(), lt.end());swap(tmp);}list<int>& operator=(list<T> lt){swap(lt);return *this;}void print(){for (auto e : *this){cout << e << " ";}cout << endl;}void clear(){iterator it = begin();while (it != end()){erase(it++);//it++最終it加一,返回it沒加一時的臨時變量}}~list(){clear();delete _head;}void push_back(const T& x){insert(end(), x);}void push_front(const T& x){insert(begin(), x);}void pop_back(){erase(--end());}void erase(iterator pos){node* prev = pos._node->_prev;node* next = pos._node->_next;prev->_next = next;next->_prev = prev;delete pos._node;}void insert(iterator pos, const T& x){node* prev = pos._node->_prev;node* pcur = pos._node;node* new_node = new node(x);prev->_next = new_node;new_node->_prev = prev;new_node->_next = pcur;pcur->_prev = new_node;}private:node* _head;};
}
1.list是帶頭雙向循環鏈表
2.list的節點設計如上,兩個指針和一個T類型數據data
3.list類的成員只有哨兵節點,沒有size成員,這是gcc的設計思路,在獲取size時遍歷獲得,這樣在插入和刪除時不用關心size的變化
4.最重要的是迭代器,list的迭代器不再和vector與string一樣是原生指針了,而是封裝了結點指針的類,但要注意的是? *迭代器? 返回的不是節點的引用,而是節點數據的引用T&,迭代器->成員? 訪問的是節點數據T的成員,編譯器會先調operator->得到節點數據的地址T*,然后再->訪問成員
5.迭代器有三個模板參數,這是為了實例化出迭代器和const迭代器
6.反向迭代器適配正向迭代器得到,有三個模板參數同樣是為了實例化出反向迭代器和const反向迭代器

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78523.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78523.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78523.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于 PyQt 的YOLO目標檢測可視化界面+ nuitka 打包

在人工智能和計算機視覺領域&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;是一種廣泛使用的實時目標檢測算法。為了直觀地展示YOLO算法的檢測效果&#xff0c;我們使用Pyqt框架進行檢測結果的可視化&#xff0c;同時為了使其能夠脫離Python環境&#xff0c;我們…

2.1 閱讀錯題---02-04年

引言 2002年-2004年英語閱讀錯題匯總與分析總結。 一、02年閱讀 Text 1 題目&#xff1a;21題 題型&#xff1a;細節題 原因&#xff1a;單詞認錯了&#xff0c;原句中 in sympathy with 譯為 與…一致 &#xff1b;題干中的 sympathy 譯為 同情 題目&#xff1a;22題 題…

Axure疑難雜癥:中繼器制作下拉菜單(多級中繼器高級交互)

親愛的小伙伴,在您瀏覽之前,煩請關注一下,在此深表感謝! Axure產品經理精品視頻課已登錄CSDN可點擊學習https://edu.csdn.net/course/detail/40420 本文視頻課程記錄于上述地址第五章中繼器專題第11節 課程主題:中繼器制作下拉菜單 主要內容:創建條件選區、多級中繼器…

即刻啟程,踏上W55MH32高性能以太網單片機學習之路!

單芯片解決方案&#xff0c;開啟全新體驗——W55MH32 高性能以太網單片機 W55MH32是WIZnet重磅推出的高性能以太網單片機&#xff0c;它為用戶帶來前所未有的集成化體驗。這顆芯片將強大的組件集于一身&#xff0c;具體來說&#xff0c;一顆W55MH32內置高性能Arm Cortex-M3核心…

C++負載均衡遠程調用學習之上報功能與存儲線程池

目錄 1. Lars-reportV0.1 report模塊介紹 2.Lars-reporterV0.1 reporter項目目錄構建 3.Lars-ReporterV0.1 數據表和proto協議環境搭建 4.Lars-ReporterV0.1上報請求業務處理 5.Lars-ReporterV0.1上報請求模塊的測試 6.Lars-ReporterV0.2開辟存儲線程池-網絡存儲分離 1. L…

LabVIEW三軸電機控制

在工業自動化迅猛發展的當下&#xff0c;多軸伺服電機控制系統在制造業、3D 打印等眾多領域的需求與日俱增。它不僅要實現高精度的單軸運動控制&#xff0c;還需保障多軸協同作業的精準度&#xff0c;對響應速度也有嚴格要求。LabVIEW 開發多軸伺服電機控制系統&#xff0c;有效…

驅動開發硬核特訓 · Day 27(下篇):深入掌握 Common Clock Framework 架構與實戰開發

節。 在本篇內容中&#xff0c;我們將圍繞 Linux 內核中的時鐘子系統核心架構 —— Common Clock Framework&#xff08;簡稱 CCF&#xff09;展開深入講解&#xff0c;目標是幫助你全面理解其設計理念、主要數據結構、注冊流程、驅動實現方式&#xff0c;以及如何基于 NXP i.M…

數據庫基礎:數據庫類型與MySQL特點詳解

一、數據庫的主要類型 1. 關系型數據庫(RDBMS) 特點:基于關系模型,數據以表格形式存儲 代表產品:MySQL、Oracle、SQL Server、PostgreSQL 優勢:ACID事務支持、強一致性、成熟的SQL標準 適用場景:需要復雜查詢和事務支持的場景 2. 非關系型數據庫(NoSQL) 文檔型數據庫:Mo…

49認知干貨:產品的生命周期及類型匯總

49章:產品的生命周期與類型劃分 宇宙是運動的而非靜止的,任何事物亦是如此。只要是存在的事物,便必然存在周期性變化,就像四季更替中的冬日枯樹、春日新芽、夏日繁茂與秋日凋零。 這也意味著:事物的發展,離不開周期的更迭與演化,死亡并非終點,而是一種新的循環轉變。 …

【2025最新】為什么用ElasticSearch?和傳統數據庫MySQL與什么區別?

Elasticsearch 深度解析&#xff1a;從原理到實踐 一、為什么選擇 Elasticsearch&#xff1f; 數據模型 Elasticsearch 是基于文檔的搜索引擎&#xff0c;它使用 JSON 文檔來存儲數據。在 Elasticsearch 中&#xff0c;相關的數據通常存儲在同一個文檔中&#xff0c;而不是分散…

Docker安裝Gitblit(圖文教程)

本章教程,使用Docker安裝部署Gitblit。 一、Gitblit簡介 Gitblit 是一個基于 Java 的 Git 倉庫管理工具,主要用于在局域網或小型團隊環境中搭建私有 Git 服務器。它提供了一個簡單易用的 Web 界面,用于瀏覽代碼、管理倉庫和用戶權限等。 二、拉取鏡像 sudo docker pull git…

nDCG(歸一化折損累計增益) 是衡量排序質量的指標,常用于搜索引擎或推薦系統

nDCG&#xff08;歸一化折損累計增益&#xff09; 是衡量排序質量的指標&#xff0c;常用于搜索引擎或推薦系統。核心思想是&#xff1a;排名越靠前的高質量結果&#xff0c;對整體評分的貢獻越大&#xff0c;但后續結果的貢獻會逐漸“打折”。最終通過對比實際排序與理想排序的…

《從線性到二維:CSS Grid與Flex的布局范式革命與差異解析》

在前端開發的廣袤宇宙中&#xff0c;CSS布局技術宛如閃耀的星辰&#xff0c;不斷革新與演進&#xff0c;為構建絢麗多彩的網頁世界提供了堅實的支撐。其中&#xff0c;CSS Grid布局與Flex布局作為兩顆璀璨的明星&#xff0c;以其獨特的魅力和強大的功能&#xff0c;深受開發者們…

2025年01月03日美蜥(杭州普瑞兼職)一面

目錄 vue2 vue3 的區別react 性能優化react 組件傳值v-for 和 v-if 的優先級react 中多個接口請求的數據&#xff0c;需要渲染到一個列表上怎么處理百萬條數據怎么渲染vue2、vue3 的響應式原理微前端了解嗎git 版本控制git mearge 和 git rebase 的區別垂直水平居中react 中實…

【聚類分析】基于copula的風光聯合場景生成與縮減

目錄 1 主要內容 風光出力場景生成方法 2 部分程序 3 程序結果 4 下載鏈接 1 主要內容 該程序方法復現《融合風光出力場景生成的多能互補微網系統優化配置》風光出力場景生成部分&#xff0c;目前大多數研究的是不計風光出力之間的相關性影響&#xff0c;但是地理位置相近…

LeetCode 1128 等價多米諾骨牌對的數量 題解

今天的每日一題&#xff0c;我的思路還是硬做&#xff0c;不如評論區通過狀壓寫的簡單&#xff0c;但是答題思路加算法實現是沒有問題的&#xff0c;且時間復雜度也是可以通過的&#xff0c;畢竟全是o(n) 那么我就來說一下我的思路&#xff0c;根據dominoes[i] [a, b] 與 domi…

技術部測試規范

簡短測試流程&#xff1a; 開發完成 -> 本地自測 -> 測試環境自測 -> 通知測試同事復測 -> 確認無誤后上生產 -> 生產環境自測 -> 再次通知測試同事復測 -> 提交產品驗收。 當然可以&#xff01;以下是進一步優化后的測試流程規范&#xff0c;特別強調了開…

算法每日一題 | 入門-順序結構-大象喝水

大象喝水 題目描述 一只大象口渴了&#xff0c;要喝 20 升水才能解渴&#xff0c;但現在只有一個深 h 厘米&#xff0c;底面半徑為 r 厘米的小圓桶 &#xff08;h 和 r 都是整數&#xff09;。問大象至少要喝多少桶水才會解渴。 這里我們近似地取圓周率 π 3.14 \pi3.14 π…

Qt中實現工廠模式

在Qt中實現工廠模式可以通過多種方式&#xff0c;具體選擇取決于需求和場景。以下是幾種常見的實現方法&#xff1a; 1. 簡單工廠模式通過一個工廠類根據參數創建不同對象。cppclass Shape {public: virtual void draw() 0; virtual ~Shape() default;};class Circle : publ…

【前端】ES6一本通_劃重點_補充面試題

近兩天更新完基本內容&#xff0c;后續長期更新&#xff0c;建議關注收藏點贊。 ES6&#xff08;ECMAScript 2015&#xff09;是現代 JavaScript 的基礎&#xff0c;在前端面試中非常常見。 本文已匯總的本站筆記 ES6最重要10特性 對象新增 數組新增 異步、生成器 Promise 模塊…