C++初階——簡單實現list

目錄

1、前言

2、List.h

3、Test.cpp


1、前言

1. 簡單實現std::list,重點:迭代器,模板類,運算符重載。

2. 并不是,所有的類,都需要深拷貝,像迭代器類模板,只是用別的類的資源,不需要深拷貝。

3. 高度相似 -> 模板。

4.?迭代器的種類

功能:iterator,reverse_iterator,const_iterator,const_reverse_iterator。

按結構(性質):決定可以使用什么算法

單向(Forward):forward_list/unordered_map/unordered_set? ? ++

雙向(Bidirectional):list/map/set? ? ++/--

隨機(Random Access):vector/string/deque? ? ++/--/+/-

2、List.h

#pragma once#include <iostream>
#include <list>
#include <assert.h>using namespace std;namespace Lzc
{template<class T>struct list_node{typedef list_node<T> Node;T _data;Node* _next;Node* _prev;list_node(const T& data = T()):_data(data), _next(nullptr), _prev(nullptr){}};//template<class T>//struct list_iterator//{//	typedef list_node<T> Node;//	typedef list_iterator<T> iterator;//	Node* _node;//	list_iterator(Node* node)//		:_node(node)//	{}//	T& operator*() const//	{//		return _node->_data;//	}//	T* operator->() const//	{//		return &_node->_data;//	}//	iterator& operator++() // 前置++//	{//		_node = _node->_next;//		return *this;//	}//	iterator operator++(int) // 后置++//	{//		iterator tmp(_node);//		_node = _node->_next;//		return tmp;//	}//	iterator& operator--() // 前置--//	{//		_node = _node->_prev;//		return *this;//	}//	iterator operator--(int) // 后置--//	{//		iterator tmp(_node);//		_node = _node->_prev;//		return tmp;//	}//	bool operator!=(const iterator& it) const//	{//		return _node != it._node;//	}//  bool operator==(const iterator& it) const//	{//		return _node == it._node;//	}//};//template<class T>//struct list_const_iterator//{//	typedef list_node<T> Node;//	typedef list_const_iterator<T> const_iterator;//	Node* _node;//	list_const_iterator(Node* node)//		:_node(node)//	{//	}//	const T& operator*() const//	{//		return _node->_data;//	}//	const T* operator->() const//	{//		return &_node->_data;//	}//	const_iterator& operator++() // 前置++//	{//		_node = _node->_next;//		return *this;//	}//	const_iterator operator++(int) // 后置++//	{//		iterator tmp(_node);//		_node = _node->_next;//		return tmp;//	}//	const_iterator& operator--() // 前置--//	{//		_node = _node->_prev;//		return *this;//	}//	const_iterator operator--(int) // 后置--//	{//		iterator tmp(_node);//		_node = _node->_prev;//		return tmp;//	}//	bool operator!=(const const_iterator& it) const//	{//		return _node != it._node;//	}// 	bool operator==(const const_iterator& it) const//	{//		return _node == it._node;//	}//};// 高度相似->模板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* node) // 就是要指針,淺拷貝,沒問題:_node(node){}Ref operator*() const{return _node->_data;}Ptr operator->() const{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& it) const{return _node != it._node;}bool operator==(const Self& it) const{return _node == it._node;}};template<class T>class list{typedef list_node<T> Node; // 只有list類的成員函數或者友元才能使用這個類型別名public:typedef list_iterator<T, T&, T*> iterator;typedef list_iterator<T, const T&, const T*> const_iterator;//typedef list_iterator<T> iterator;//typedef list_const_iterator<T> const_iterator;iterator begin(){return _head->_next; // 隱式類型轉換}iterator end(){return _head;}const_iterator begin() const{return _head->_next;}const_iterator end() const{return _head;}void empty_initialize(){_head = new Node;_head->_next = _head->_prev = _head;_size = 0;}list(){empty_initialize();}list(initializer_list<T> lt){empty_initialize();for (auto& e : lt){push_back(e);}}list(const list& lt){// list();構造函數不能被直接調用empty_initialize();for (auto& e : lt){push_back(e);}}void swap(list& tmp){std::swap(_head, tmp._head);std::swap(_size, tmp._size);}list& operator=(const list& lt){list tmp(lt);swap(tmp);return *this;}void clear(){while (!empty()){pop_front();}}~list(){clear();delete _head;_head = nullptr;_size = 0;}size_t size() const{return _size;}bool empty() const{return _size == 0;}void push_back(const T& val){insert(end(), val);}void push_front(const T& val){insert(begin(), val);}iterator insert(iterator pos, const T& val);void pop_front(){erase(begin());}void pop_back(){erase(_head->_prev);}iterator erase(iterator pos);private:Node* _head;size_t _size;};template<class T>typename list<T>::iterator list<T>::insert(iterator pos, const T& val){Node* newNode = new Node(val);Node* cur = pos._node;Node* prev = cur->_prev;prev->_next = newNode;newNode->_prev = prev;newNode->_next = cur;cur->_prev = newNode;++_size;return newNode;}template<class T>typename list<T>::iterator list<T>::erase(iterator pos){assert(pos != _head);Node* cur = pos._node;Node* next = cur->_next;Node* prev = cur->_prev;prev->_next = next;next->_prev = prev;delete cur;--_size;return next;}template<class Container>void print_Container(const Container& con){for (auto& e : con){cout << e << " ";}cout << endl;}
}

3、Test.cpp

#include "List.h"namespace Lzc
{struct AA{int _a1 = 1;int _a2 = 1;};void test_list1(){list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);list<int>::iterator it = lt.begin();while (it != lt.end()){*it += 10;cout << *it << " ";++it;}cout << endl;for (auto e : lt){cout << e << " ";}cout << endl;print_Container(lt);list<AA> lta;lta.push_back(AA());lta.push_back(AA());lta.push_back(AA());lta.push_back(AA());list<AA>::iterator ita = lta.begin();while (ita != lta.end()){//cout << (*ita)._a1 << ":" << (*ita)._a2 << endl;cout << ita->_a1 << ":" << ita->_a2 << endl;// 特殊處理,本來應該是兩個->才合理,為了可讀性,省略了一個->// cout << ita.operator->()->_a1 << ":" << ita.operator->()->_a2 << endl;++ita;}cout << endl;}void test_list2(){list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);// insert后,it還指向begin(),沒有擴容的概念,不失效list<int>::iterator it = lt.begin();lt.insert(it, 10); *it += 100;print_Container(lt);// erase后,it為野指針,及時更新// 刪除所有的偶數it = lt.begin();while (it != lt.end()){if (*it % 2 == 0){it = lt.erase(it);}else{++it;}}print_Container(lt);}void test_list3(){list<int> lt1;lt1.push_back(1);lt1.push_back(2);lt1.push_back(3);lt1.push_back(4);list<int> lt2(lt1);print_Container(lt1);print_Container(lt2);list<int> lt3;lt3.push_back(10);lt3.push_back(20);lt3.push_back(30);lt3.push_back(40);lt1 = lt3;print_Container(lt1);print_Container(lt3);}void func(const list<int>& lt){print_Container(lt);}void test_list4(){// 直接構造list<int> lt0({ 1,2,3,4,5,6 });// 隱式類型轉換list<int> lt1 = { 1,2,3,4,5,6,7,8 };const list<int>& lt3 = { 1,2,3,4,5,6,7,8 };func(lt0);func({ 1,2,3,4,5,6 });print_Container(lt1);// template<class T> class initializer_list;// { 10, 20, 30 }是一種initializer_list<int>類型//auto il = { 10, 20, 30 };//initializer_list<int> il = { 10, 20, 30 };//cout << typeid(il).name() << endl;//cout << sizeof(il) << endl;}
}int main()
{Lzc::test_list1();Lzc::test_list2();Lzc::test_list3();Lzc::test_list4();return 0;
}

注意:聲明和定義分離時,為什么定義時,是list<T>::iterator,不是iterator,因為iterator在list<T>中typedef了,就屬于list<T>的成員變量了。

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

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

相關文章

conda環境中運行“python --version“所得的版本與環境中的python版本不一致----deepseek并非全能

conda環境中運行python —version所得python版本與conda環境中的python版本不一致------deepseek并非全能 問題 conda環境中運行python —version所得python版本與conda環境中的python版本不一致 我所做的探索 1 網頁搜索 2 求助于DeepSeek 可以用四個字來形容deepseek給出…

HarmonyOS學習第5天: Hello World的誕生之旅

鴻蒙初印象&#xff1a;開啟探索之門 在操作系統的廣袤天地中&#xff0c;HarmonyOS&#xff08;鴻蒙系統&#xff09;宛如一顆冉冉升起的新星&#xff0c;自誕生起便備受矚目。它由華為傾力打造&#xff0c;是一款基于微內核的全場景分布式操作系統&#xff0c;以其獨特的技術…

centos9安裝k8s集群

以下是基于CentOS Stream 9的Kubernetes 1.28.2完整安裝流程&#xff08;containerd版&#xff09;&#xff1a; 一、系統初始化&#xff08;所有節點執行&#xff09; # 關閉防火墻 systemctl disable --now firewalld# 關閉SELinux sed -i "s/SELINUXenforcing/SELINU…

CIG容器重量級監控系統

1.介紹 CAdvisorinfluxDBGranfana docker 原生命令 監控docker容器狀態 docker stats 2.CAdvicsor 3.InfluxDB 4.Granafana 5.搭建 volumes:grafana_data: services:influxdb:image: tutum/influxdbrestart: alwaysenvironment:- PRE_CREATE_DBcadvisorports:- "8083…

REACT學習DAY02(恨連接不上服務器)

受控表單綁定 概念&#xff1a;使用React組件的狀態&#xff08;useState&#xff09;控制表單的狀態 1. 準備一個React狀態值 const [value,setValue] useState() 2. 通過value屬性綁定狀態&#xff0c;通過onChange屬性綁定狀態同步的函數 <input type"text&quo…

python——GUI圖形用戶界面編程

GUI簡介 我們前面實現的都是基于控制臺的程序&#xff0c;程序和用戶的交互通過控制臺來完成 本章&#xff0c;我們來學習GUI圖形用戶界面編程&#xff0c;我們可以通過python提供的豐富的組件&#xff0c;快速的視線使用圖形界面和用戶交互 GUI變成類似于“搭積木”&#x…

DeepSeek 助力 Vue 開發:打造絲滑的單選按鈕(Radio Button)

前言&#xff1a;哈嘍&#xff0c;大家好&#xff0c;今天給大家分享一篇文章&#xff01;并提供具體代碼幫助大家深入理解&#xff0c;徹底掌握&#xff01;創作不易&#xff0c;如果能幫助到大家或者給大家一些靈感和啟發&#xff0c;歡迎收藏關注哦 &#x1f495; 目錄 Deep…

美顏相機1.0

項目開發步驟 1 界面開發 美顏相機界面構成&#xff1a; 標題 尺寸 關閉方式 位置 可視化 2 創建主函數調用界面方法 3 添加兩個面板 一個是按鈕面板一個是圖片面板 用JPanel 4 添加按鈕到按鈕面吧【注意&#xff1a;此時要用初始化按鈕面板的方法initBtnPanel 并且將按鈕添…

openharmony中hdf框架的驅動消息機制的實現原理

openharmony中hdf框架的驅動消息機制的實現原理 在分析hdf框架時發現繞來繞去的&#xff0c;整體梳理畫了一遍流程圖&#xff0c;發現還是有點模糊甚至不清楚如何使用的&#xff0c;詳細的每個點都去剖析細節又過于消耗時間&#xff0c;所以有時間便從功能應用的角度一塊塊的去…

leaflet實現歷史軌跡播放效果

效果圖如下&#xff1a; 效果實現&#xff1a; 1、添加完整軌跡線&#xff0c;藍色的 this.echoLine L.polyline(points, { weight: 8 }).addTo(this.map) 2、添加實時軌跡線&#xff0c;初始狀態置空 this.realEchoLine L.polyline([], { weight: 12, color: "#FF9…

JAVAEE一>Spring IoC和DI詳解

目錄 Spring容器說明&#xff1a;Ioc容器優勢&#xff1a;DI介紹&#xff1a;從Spring獲取對象&#xff1a;獲取對象的方法&#xff1a;關于上下文的概念&#xff1a; Controller注解&#xff08;控制層&#xff1a;接收參數并響應&#xff09;&#xff1a;Service注解&#xf…

(四)趣學設計模式 之 原型模式!

目錄 一、 啥是原型模式&#xff1f;二、 為什么要用原型模式&#xff1f;三、 原型模式怎么實現&#xff1f;四、 原型模式的應用場景五、 原型模式的優點和缺點六、 總結 &#x1f31f;我的其他文章也講解的比較有趣&#x1f601;&#xff0c;如果喜歡博主的講解方式&#xf…

完美解決:.vmx 配置文件是由 VMware 產品創建,但該產品與此版 VMware Workstation 不兼容

參考文章&#xff1a;該產品與此版 VMware Workstation 不兼容&#xff0c;因此無法使用 問題描述 當嘗試使用 VMware Workstation 打開別人的虛擬機時&#xff0c;可能會遇到以下報錯&#xff1a; 此問題常見于以下場景&#xff1a; 從其他 VMware 版本&#xff08;如 ESX…

Linux——安裝Git的方法

安裝Git的命令&#xff1a; yum -y install git查看Git的版本&#xff1a; git --version

編程小白沖Kaggle每日打卡(13)--kaggle學堂:<機器學習簡介>基礎數據探索

Kaggle官方課程鏈接&#xff1a;Basic Data Exploration 本專欄旨在Kaggle官方課程的漢化&#xff0c;讓大家更方便地看懂。 Basic Data Exploration 加載并理解您的數據。 使用Pandas熟悉您的數據 任何機器學習項目的第一步都是熟悉數據。您將使用Pandas庫進行此操作。Pand…

從零開始的網站搭建(以照片/文本/視頻信息通信網站為例)

本文面向已經有一些編程基礎&#xff08;會至少一門編程語言&#xff0c;比如python&#xff09;&#xff0c;但是沒有搭建過web應用的人群&#xff0c;會寫得盡量細致。重點介紹流程和部署云端的步驟&#xff0c;具體javascript代碼怎么寫之類的&#xff0c;這里不會涉及。 搭…

【Java項目】基于SpringBoot的【高校校園點餐系統】

【Java項目】基于SpringBoot的【高校校園點餐系統】 技術簡介&#xff1a;采用Java技術、MySQL數據庫、B/S結構實現。 系統簡介&#xff1a;高校校園點餐系統是一個面向高校師生的在線點餐平臺&#xff0c;主要分為前臺和后臺兩大模塊。前臺功能模塊包括&#xff08;1&#xff…

Django check_password原理

check_password 是 Django 提供的一個用于密碼校驗的函數&#xff0c;它的工作原理是基于密碼哈希算法的特性。 Django 的 make_password 函數在生成密碼哈希時&#xff0c;會使用一個隨機的 salt&#xff08;鹽值&#xff09;。這個 salt 會與密碼一起進行哈希運算&#xff0…

Vulnhun靶機-kioptix level 4-sql注入萬能密碼拿到權限ssh連接利用mysql-udf漏洞提權

目錄 一、環境搭建信息收集掃描ip掃描開放端口掃描版本服務信息指紋探測目錄掃描 二、Web滲透sql注入 三、提權UDF提權修改權限 一、環境搭建 然后選擇靶機所在文件夾 信息收集 本靶機ip和攻擊機ip 攻擊機&#xff1a;192.168.108.130 靶機&#xff1a;192.168.108.141 掃描…

PHP 會話(Session)實現用戶登陸功能

Cookie是一種在客戶端和服務器之間傳遞數據的機制。它是由服務器發送給客戶端的小型文本文件&#xff0c;保存在客戶端的瀏覽器中。每當瀏覽器向同一服務器發送請求時&#xff0c;它會自動將相關的Cookie信息包含在請求中&#xff0c;以便服務器可以使用這些信息來提供個性化的…