一文學會c++list

文章目錄

  • list簡介
  • list接口
  • 迭代器失效
  • 🚩模擬實現

list簡介

1,list是可以在常數時間復雜度任何位置隨意插入的序列式容器,可以雙向迭代
2,底層是雙向鏈表結構,每個節點都是獨立的,通過前后指針鏈接
3,相比vector,list隨機插入更快,但是要訪問隨機元素更復雜,需要線性時間開銷;還需要額外空間開銷(保存前后指針);

list接口

和前文的string,vector接口一致,這里就不贅述了,無非多了頭插頭刪
vector講解

迭代器失效

與前文的vector一樣,如果指針指向當前位置被釋放,再訪問就會崩潰

#include <iostream>
#include <list>
using namespace std;
int main()
{int a[] = {4, 5, 6};list<int> l1(a, a + sizeof(a) / sizeof(int));auto it = l1.begin();while(it!=l1.end()){cout << *it;//l1.erase(it);//it++;//錯誤it = l1.erase(it);//正確}return 0;
}

🚩模擬實現

#include <iostream>
namespace jib {template<class T>struct ListNode{ListNode(const T& val = T()):_prev(nullptr),_next(nullptr),_val(val){}ListNode<T>* _prev;ListNode<T>* _next;T _val;};template<class T, class Ref, class Ptr>struct ListIterator{typedef ListNode<T> Pnode;typedef ListIterator<T, Ref, Ptr> self;Pnode* _node;ListIterator(Pnode* pnode = nullptr):_node(pnode){}ListIterator(const self& l):_node(l._node){}Ref operator*(){return _node->_val;}Ptr operator->(){return &_node->_val;}self& operator++(){_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(*this);_node = _node->_prev;return tmp;}bool operator!=(self& l) const{return _node != l._node;}bool operator==(self& l) const{return !(*this!=l);}};template<class T>class list {typedef ListNode<T> Node;public:typedef ListIterator<T, T&, T*> iterator;typedef ListIterator<T, const T&, const T*> const_iterator;list(){CreateNode();}list(int n, const T& value = T()){CreateNode();for(int i=0;i<n;i++){push_back(value);}}template <class Iterator>list(Iterator first, Iterator last){CreateNode();while (first != last){push_back(*first);++first;}}list(const list<T>& l){CreateNode();list<T> tmp(l.begin(),l.end());this->swap(tmp);}list<T>& operator=(const list<T> l){this->swap(l);return *this;}~list(){clear();delete _phead;_phead = nullptr;}///////////////////////////////////////////////////////////////// List Iteratoriterator begin(){return iterator(_phead->_next);}iterator end(){return iterator(_phead);}const_iterator begin() const{return const_iterator(_phead->_next);}const_iterator end() const{return const_iterator(_phead);}///////////////////////////////////////////////////////////////// List Capacitysize_t size()const{size_t sz = 0;Node* p = _phead->_next;while (p != _phead){sz++;p = p->_next;}return sz;}bool empty()const{return size() == 0;}////////////////////////////////////////////////////////////// List AccessT& front(){access(!empty());return _phead->_next->_val;}const T& front()const{access(!empty());return _phead->_next->_val;}T& back(){access(!empty());return _phead->_prev->_val;}const T& back()const{access(!empty());return _phead->_prev->val;}////////////////////////////////////////////////////////////// List Modifypublic:void push_back(const T& val) { insert(end(), val); }void pop_back() { erase(--end()); }void push_front(const T& val){ insert(begin(), val); }void pop_front() { erase(begin()); }// 在pos位置前插入值為val的節點iterator insert(iterator pos, const T& val){Node* newnode = new Node(val);Node* cur=pos._node;newnode->_prev = cur->_prev;newnode->_next = cur;cur->_prev->_next = newnode;cur->_prev = newnode;return iterator(newnode);}iterator erase(iterator pos){Node* cur = pos._node;Node* curnext = cur->_next;curnext->_prev = cur->_prev;cur->_prev->_next = curnext;delete cur;cur = nullptr;return iterator(curnext);}void clear(){iterator p = begin();while (!empty()){p = erase(p);}_phead->_next = _phead;_phead->_prev = _phead;}void swap(list<T>& l){std::swap(_phead, l._phead);}private:void CreateNode(){_phead = new Node;_phead->_next = _phead;_phead->_prev = _phead;}Node* _phead;};
}

先開辟節點類,再開辟迭代器類,再創建list類
注意 it用法:

struct Person {std::string name;int age;void print() { std::cout << name << ", " << age; }
};jib::list<Person> people;
people.push_back(Person{"Alice", 30});auto it = people.begin();
std::cout << it->name;  // 輸出 "Alice"
it->age = 31;           // 修改年齡
it->print();            // 調用成員函數

調用 it.operator->(),返回 &_node->_val
編譯器自動對結果應用 ->,變成== (&_node->_val)->name==

編譯器自動省略了一個->

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

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

相關文章

數據集分享 | 智慧農業實戰數據集精選

【導讀】 在智慧農業的發展浪潮下&#xff0c;AI視覺算法正逐步滲透進作物生長監控、病蟲害檢測、采摘成熟評估等細分任務。相較于工業或城市場景&#xff0c;農業視覺更具挑戰性&#xff1a;自然環境復雜、目標形態多變、時空尺度差異大。 為實現精準農業管理&#xff0c;一…

CCFRec-人大高瓴-KDD2025-序列推薦中充分融合協同信息與語義信息

文章目錄1. 背景與問題2. 方法2.1 多視圖 sid2.2 Code-Guided Semantic Fusion核心創新&#xff1a;常規操作&#xff1a;2.3 Enhanced Representation Learning via Code Masking2.3.1 Masked Code Modeling (MCM)2.3.2 Masked Sequence Alignment (MSA)2.4 復雜度分析2.4.1 訓…

Python深入 Tkinter 模塊

目錄 一、為什么要寫 Tkinter 二、最小可運行示例&#xff1a;Hello World 不是終點&#xff0c;而是起點 三、布局三板斧&#xff1a;pack、grid、place 四、事件與回調&#xff1a;讓按鈕“響”起來 五、實戰案例&#xff1a;秒表 文件批量重命名器 六、樣式進階&…

LeetCode 面試經典 150_數組/字符串_刪除有序數組中的重復項(3_26_C++_簡單)

LeetCode 面試經典 150_刪除有序數組中的重復項&#xff08;3_26_C_簡單&#xff09;題目描述&#xff1a;輸入輸出樣例&#xff1a;題解&#xff1a;解題思路&#xff1a;思路一&#xff08;雙指針&#xff09;&#xff1a;代碼實現代碼實現&#xff08;思路一&#xff08;雙指…

架構篇(一):告別MVC/MVP,為何“組件化”是現代前端的唯一答案?

架構篇(一)&#xff1a;告別MVC/MVP&#xff0c;為何“組件化”是現代前端的唯一答案&#xff1f; 引子&#xff1a;一個困擾前端工程師的“幽靈” 在上一章《序章&#xff1a;拋棄UI&#xff0c;我們來構建一個“看不見”的前端應用》中&#xff0c;我們從零開始構建了一個純…

數組內存學習

一、內存簡介&#xff1a;1.內存分為5塊&#xff1a;a.棧&#xff08;Stack&#xff09;主要運行方法&#xff0c;方法的運行都會進入棧內存運行&#xff0c;云南行完畢之后&#xff0c;需要“彈棧”&#xff0c;為了騰空間。b.堆&#xff08;Heap&#xff09;保存的是對象&…

驗證 GitHub Pages 的自定義域(Windows)

驗證 GitHub Pages 的自定義域 您可以通過驗證您的域來提高自定義域的安全性并避免接管攻擊。 誰可以使用此功能? GitHub Pages 在公共存儲庫中提供 GitHub Free 和 GitHub Free for organizations,在公共和私有存儲庫中提供 GitHub Pro、GitHub Team、GitHub Enterprise Cl…

數字化轉型 - 企業數字化建設的幾點思考

關于企業數字化建設的幾點思考工業軟件領軍人才的培訓課中&#xff0c;如上的一個PPT&#xff0c;給人以許多反思。一是看企業成功的數字化案例時&#xff0c;也許只看到別人面上的東西&#xff0c;可能還有面下很多看不到的東西支撐著&#xff0c;因此可能只看到或學到別人的皮…

深入解析Java內存模型:原理與并發優化實踐

深入解析Java內存模型&#xff1a;原理與并發優化實踐 技術背景與應用場景 隨著多核處理器的普及&#xff0c;Java并發編程已成為后端系統提升吞吐量與響應性能的必備手段。然而&#xff0c;在多線程環境下&#xff0c;不同線程對共享變量的可見性、指令重排以及內存屏障控制都…

《設計模式之禪》筆記摘錄 - 9.責任鏈模式

責任鏈模式的定義責任鏈模式定義如下&#xff1a;Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.…

05-ES6

數據解構SetES6 提供了新的數據結構 Set。它類似于數組&#xff0c;但是成員的值都是唯一的&#xff0c;沒有重復的值Set 本身是一個構造函數&#xff0c;用來生成 Set 數據結構//set集合&#xff0c;成員是唯一的,添加過程中會替換相同的元素。這里相同的標準是const s new S…

正則表達式 \b:單詞邊界

下面舉例說明 \b 用法。\b(?:https?://)(\S)\b各部分功能&#xff1a;\b&#xff1a;單詞邊界&#xff0c;確保匹配的 URL 是獨立的單詞&#xff0c;不會與其他字符粘連。(?:https?://)&#xff1a;非捕獲組&#xff0c;匹配 http:// 或 https://&#xff08;s? 表示 s 可…

從8h到40min的極致并行優化:Spark小數據集UDTF處理的深度實踐與原理剖析

在大數據領域&#xff0c;Spark以其卓越的并行處理能力著稱。但面對小數據集的極致并行需求時&#xff0c;默認優化策略往往成為瓶頸。本文將深入剖析如何通過精準控制分區策略&#xff0c;將僅170條數據的表拆分成170個獨立Task并行執行&#xff0c;實現100%的并行度&#xff…

JAVA算法題練習day1

開始前&#xff1a; 選擇leetcode-hot100。要求每日1道&#xff0c;并且需要親自二刷昨天的題目&#xff08;每一種解法&#xff09;&#xff0c;要做解題筆記并發布CSDN&#xff0c;做完立刻二刷。做題時間為每日12&#xff1a;50起&#xff0c;不拖延&#xff0c;這是學習成…

【Word Press進階】自定義區塊的行為與樣式

前兩篇 【Word Press基礎】創建自定義區塊【Word Press基礎】創建一個動態的自定義區塊 說明白了怎么創建一個簡單的靜態區塊。但實在是太丑了。這里再進行一個優化&#xff0c;讓咱們的區塊好看又好用。 一個合格的區塊應當有著好看的外表&#xff0c;完整的功能&#xff0…

Pygame模塊化實戰:火星救援游戲開發指南

Pygame模塊化實戰&#xff1a;火星救援游戲開發指南用Python打造太空探險游戲&#xff0c;掌握模塊化開發核心技巧一、火星救援&#xff1a;模塊化開發的完美場景??想象這樣的場景??&#xff1a; 你是一名宇航員&#xff0c;被困在火星表面&#xff0c;需要收集資源、修復飛…

三維圖像識別中OpenCV、PCL和Open3D結合的主要技術概念、部分示例

文章目錄1. 三維點云基礎概念點云(Point Cloud)深度圖像(Depth Image)體素(Voxel)2. 點云預處理技術去噪濾波(Noise Filtering)降采樣(Downsampling)3. 特征提取與描述法向量估計(Normal Estimation)關鍵點檢測(Keypoint Detection)特征描述子(Feature Descriptor)4. 點云配準(…

7.23數據結構——單鏈表

文章目錄一、思維導圖二、單鏈表代碼head.htext.cmain.c現象一、思維導圖 二、單鏈表代碼 head.h #ifndef __HEAD_H__ #define __HEAD_H__#include <stdlib.h> #include <stdio.h> #include <string.h>enum A {FAULSE-1,//失敗返回SUCCESS//成功返回};//給…

某種物聯網SIM卡流量查詢方法

說起流量卡,很多人可能還停留在營業廳辦理的常規套餐里。但其實在 2016 年,三大運營商就推出了一種資費更為劃算的正規流量卡 —— 物聯卡。當年,當不少人還在用 50 元 1G 的流量時,第一批體驗物聯卡的用戶已經享受到了 53 元 6G 的全國流量,徹底擺脫了流量焦慮。不過,至…

XTTS實現語音克隆:精確控制音頻格式與生成流程【TTS的實戰指南】

言簡意賅的講解XTTS解決的痛點 &#x1f4ce; 前置操作&#xff1a;如何使用 OBS Studio 錄制高質量 WAV 語音&#xff08;建議先閱讀并準備錄音樣本&#xff09; 本教程介紹如何使用 Coqui TTS 的 XTTS v2 模型 實現中文語音克隆&#xff0c;支持直接傳入 .wav 文件&#xff0…