c++: 容器vector

文章目錄

  • 介紹
  • initializer_list
  • 與string的不同
  • 底層
  • 總代碼

介紹

C++ 中的 vector 是一種序列容器,它允許你在運行時動態地插入和刪除元素。
vector 是基于數組的數據結構,但它可以自動管理內存,這意味著你不需要手動分配和釋放內存。
與 C++ 數組相比,vector 具有更多的靈活性和功能,使其成為 C++ 中常用的數據結構之一。
vector 是 C++ 標準模板庫(STL)的一部分,提供了靈活的接口和高效的操作。
C++ 中的 vector 是一種序列容器,它允許你在運行時動態地插入和刪除元素

在這里插入圖片描述

vector本質和 string一樣也是模板
寫法是vector< T > 名稱 (T是類型)
他與string的接口差不多,但也有一點不同 。

在這里插入圖片描述

我們來 看一下vector的構造,第一個是默認構造(看不懂的是內存池先不用管),第二個是n個 val的構造,第三個是迭代器區間的構造,第四個是拷貝構造。

initializer_list

vector 中和string比較增加了 initializer_list容器,這個容器可以作為接口的形參出現。

在這里插入圖片描述

本身我們的{ }里面的內容就是initializer_list類型的
在這里插入圖片描述

這3段代碼 不同,d1本身是是vector< int >型的接受的類型類似于d3 是initializer_list< int >型但是它進行了隱式類型轉化。
d2就是{1,2,3,4}作為形參傳過去,d3則是{ }的真正類型。

與string的不同

此外vector和string類不同就是vector沒有append函數就是不能加一個字符串,即使是vector< string >也只能一個一個加。
在這里插入圖片描述
在這里插入圖片描述
從兩邊形參上看vector只支持迭代器位置的修改,而string還支持下標位置pos的修改,同理其他接口 如erase也是這樣

底層

首先我們要知道 和string不一樣,定義char ,capacity,size。vector的成員變量都是 用迭代器定義的,我們 又可以把迭代器看作是T 就是類似于指針的東西,所以vector 就是 用指針定義的成員變量。

namespace Z
{template<class T>class vector{public:typedef T* iterator;typedef const T* const_iterator;
privite:iterator _start;//頭指針類似于.begin()iterator _finish;//結尾元素的下一位置,類似于.end()iterator _endofstorage;//類似capacity,_start-_finish得來};

我們再來寫構造函數有默認構造,還有無參構造還有initializer_list構造,析構,還有拷貝構造

	vector()//默認:_start(nullptr),_finish(nullptr),_endofstorage(nullptr){}vector(initializer_list<T> il)//initializer_list構造:_start(nullptr), _finish(nullptr), _endofstorage(nullptr){reserve(il.size());for (auto& e : il){push_back(e);}}~vector()//析構{if (_start){delete[] _start;_start = _finish = _endofstorage = nullptr;}}
vector(initializer_list<T> il)//initializer_list類型:_start(nullptr), _finish(nullptr), _endofstorage(nullptr)
{reserve(il.size());for (auto& e : il){push_back(e);}
}

其中initializer_list類型的reserve和 push_back都是省略this指針的。

常見 的一些接口

iterator begin()
{return _start;
}iterator end()
{return _finish;
}const_iterator begin() const
{return _start;
}const_iterator end() const
{return _finish;
}
T& operator[](size_t i)
{assert(i < size());return _start[i];
}size_t size() const
{return _finish - _start;
}size_t capacity() const
{return _endofstorage - _start;
}// 21:12
void reserve(size_t n)
{if (n > capacity()){size_t oldSize = size();T* tmp = new T[n];if (_start){memcpy(tmp, _start, sizeof(T) * oldSize);delete[] _start;}_start = tmp;_finish = _start + oldSize;_endofstorage = _start + n;}
}void push_back(const T& x)
{/*if (_finish == _endofstorage){reserve(capacity() == 0 ? 4 : capacity() * 2);}*_finish = x;++_finish;*/insert(_finish, x);
}bool empty()
{return _start == _finish;
}void pop_back()
{assert(!empty());--_finish;
}void insert(iterator pos, const T& x)
{assert(pos >= _start && pos <= _finish);if (_finish == _endofstorage){size_t len = pos - _start;reserve(capacity() == 0 ? 4 : capacity() * 2);pos = _start + len;}iterator i = _finish - 1;while (i >= pos){*(i + 1) = *i;--i;}*pos = x;++_finish;
}

總代碼

namespace Z
{template<class T>class vector{public:typedef T* iterator;typedef const T* const_iterator;iterator begin(){return _start;}iterator end(){return _finish;}const_iterator begin() const{return _start;}const_iterator end() const{return _finish;}vector():_start(nullptr), _finish(nullptr), _endofstorage(nullptr){}vector(initializer_list<T> il):_start(nullptr), _finish(nullptr), _endofstorage(nullptr){reserve(il.size());for (auto& e : il){push_back(e);}}~vector(){if (_start){delete[] _start;_start = _finish = _endofstorage = nullptr;}}T& operator[](size_t i){assert(i < size());return _start[i];}size_t size() const{return _finish - _start;}size_t capacity() const{return _endofstorage - _start;}// 21:12void reserve(size_t n){if (n > capacity()){size_t oldSize = size();T* tmp = new T[n];if (_start){memcpy(tmp, _start, sizeof(T) * oldSize);delete[] _start;}_start = tmp;_finish = _start + oldSize;_endofstorage = _start + n;}}void push_back(const T& x){/*if (_finish == _endofstorage){reserve(capacity() == 0 ? 4 : capacity() * 2);}*_finish = x;++_finish;*/insert(_finish, x);}bool empty(){return _start == _finish;}void pop_back(){assert(!empty());--_finish;}void insert(iterator pos, const T& x){assert(pos >= _start && pos <= _finish);if (_finish == _endofstorage){size_t len = pos - _start;reserve(capacity() == 0 ? 4 : capacity() * 2);pos = _start + len;}iterator i = _finish - 1;while (i >= pos){*(i + 1) = *i;--i;}*pos = x;++_finish;}void erase(iterator pos);private:iterator _start;iterator _finish;iterator _endofstorage;};

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

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

相關文章

Qt常用控件之表格QTableWidget

表格QTableWidget QTableWidget 是一個表格控件&#xff0c;行和列交匯形成的每個單元格&#xff0c;是一個 QTableWidgetItem 對象。 1. QTableWidget屬性 QTableWidget 的屬性只有兩個&#xff1a; 屬性說明rowCount當前行的個數。columnCount當前列的個數。 2. QTableW…

Golang學習筆記_47——訪問者模式

Golang學習筆記_44——命令模式 Golang學習筆記_45——備忘錄模式 Golang學習筆記_46——狀態模式 文章目錄 一、核心概念1. 定義2. 解決的問題3. 核心角色4. 類圖 二、特點分析三、適用場景1. 編譯器實現2. 財務系統3. UI組件系統 四、Go語言實現示例完整實現代碼執行結果 五、…

棧概念和結構

文章目錄 1. 棧的概念2. 棧的分類3. 棧的實現&#xff08;數組棧&#xff09;3.1 接口設計&#xff08;Stack.h&#xff09;3.2 接口實現&#xff08;Stack.c&#xff09;1&#xff09;初始化銷毀2&#xff09;棧頂插入刪除3&#xff09;棧頂元素、空棧、大小 3.3 完整代碼Stac…

GitCode 助力 vue3-element-admin:開啟中后臺管理前端開發新征程

源碼倉庫&#xff1a; https://gitcode.com/youlai/vue3-element-admin 后端倉庫&#xff1a; https://gitcode.com/youlai/youlai-boot 開源助力&#xff0c;開啟中后臺快速開發之旅 vue3-element-admin 是一款精心打造的免費開源中后臺管理前端模板&#xff0c;它緊密貼合…

算法.習題篇

算法 — 地大復試 模擬 while循環和MOD循環計數 1.約瑟夫問題 http://bailian.openjudge.cn/practice/3254 using namespace std;bool isNoPeople(vector<bool> c)//判斷當前數組是否一個小孩都沒有了 {bool nopeople true;for (bool ival : c){if ( ival true)nop…

大白話JavaScript實現一個函數,將字符串中的每個單詞首字母大寫。

大白話JavaScript實現一個函數&#xff0c;將字符串中的每個單詞首字母大寫。 答題思路 理解需求&#xff1a;要寫一個函數&#xff0c;它能接收一個字符串&#xff0c;然后把這個字符串里每個單詞的第一個字母變成大寫。分解步驟 拆分單詞&#xff1a;一般單詞之間是用空格隔…

react中如何使用使用react-redux進行數據管理

以上就是react-redux的使用過程&#xff0c;下面我們開始優化部分&#xff1a;當一個組件只有一個render生命周期&#xff0c;那么我們可以改寫成一個無狀態組件&#xff08;UI組件到無狀態組件&#xff0c;性能提升更好&#xff09;

廣告營銷,會被AI重構嗎?

DeepSeek設計&#xff0c;即夢AI繪圖&#xff0c;剪映成片。 DeepSeek的熱度還在高開瘋走。 用戶對于各個場景下DS應用的探索也還在持續&#xff0c;各種DS的模式被挖掘出來&#xff0c;超級個體們開始給手下的大模型團隊進行分工&#xff0c;實踐出各種場景下最佳的排列組合方…

國產編輯器EverEdit - 宏功能介紹

1 宏 1.1 應用場景 宏是一種重復執行簡單工作的利器&#xff0c;可以讓用戶愉快的從繁瑣的工作中解放出來&#xff0c;其本質是對鍵盤和菜單的操作序列的錄制&#xff0c;并不會識別文件的內容&#xff0c;屬于無差別無腦執行。 特別是對一些有規律的重復按鍵動作&#xff0c;…

vscode離線配置遠程服務器

目錄 一、前提 二、方法 2.1 查看vscode的commit_id 2.2 下載linux服務器安裝包 2.3 安裝包上傳到遠程服務器&#xff0c;并進行文件解壓縮 三、常見錯誤 Failed to set up socket for dynamic port forward to remote port&#xff08;vscode報錯解決方法&#xff09;-C…

OmniDrive(1): 論文解讀

多模態大語言模型(MLLMs)的發展推動了基于 LLM 的自動駕駛研究,以利用其強大的推理能力。然而,利用多模態大語言模型(MLLMs)強大的推理能力來改進planning具有挑戰性,因為這需要超越二維推理的完整三維情境感知能力。因為這不單單需要 2D 推理還需要完整的 3D 場景感知能…

ubuntu22.04安裝RAGFlow配合DeepSeek搭建本地知識庫

一、簡介 RAGFlow 是一個基于對文檔的深入理解的開源 RAG&#xff08;檢索增強生成&#xff09;引擎。當與 LLM 集成時&#xff0c;它能夠提供真實的問答功能&#xff0c;并以來自各種復雜格式數據的有根據的引用為后盾。 二、安裝 1.環境要求 CPU ≥ 4 核 &#xff08;x86…

Android AudioFlinger(四)—— 揭開PlaybackThread面紗

前言&#xff1a; 繼上一篇Android AudioFlinger&#xff08;三&#xff09;—— AndroidAudio Flinger 之設備管理我們知道PlaybackThread繼承自Re’fBase&#xff0c; 在被第一次引用的時候就會調用onFirstRef&#xff0c;實現如下&#xff1a; void AudioFlinger::Playbac…

個人電腦本地部署DeepSeek來離線使用

文章目錄 前言軟件下載DeepSeek部署ChatBox集成 前言 最近這段時間&#xff0c;“DeepSeek”&#xff08;深度求索&#xff09;人工智能平臺非常的火爆&#xff0c;正確的使用可以幫我們做很多很多事情&#xff0c;通常我們是在瀏覽器網頁或手機APP使用&#xff0c;但是有時會…

第一:goland安裝

GOPROXY (會話臨時性)&#xff0c;長久的可以在配置文件中配置 go env -w GOPROXYhttps://goproxy.cn,direct 長久的&#xff0c;在~/.bashrc文件中添加&#xff1a; export GOPROXYhttps://goproxy.cn,direct &#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d…

介紹一下Qt中的事件過濾

在 Qt 中&#xff0c;事件過濾&#xff08;Event Filter&#xff09;是一種強大的機制&#xff0c;它允許一個對象攔截并處理另一個對象接收到的事件。通過事件過濾&#xff0c;可以在事件到達目標對象之前對其進行監控和修改&#xff0c;這在很多場景下都非常有用&#xff0c;…

Go紅隊開發—格式導出

文章目錄 輸出功能CSV輸出CSV 轉 結構體結構體 轉 CSV端口掃描結果使用CSV格式導出 HTML輸出Sqlite輸出nmap掃描 JSONmap轉json結構體轉jsonjson寫入文件json編解碼json轉結構體json轉mapjson轉string練習&#xff1a;nmap掃描結果導出json格式 輸出功能 在我們使用安全工具的…

SwanLab簡明教程:從萌新到高手

目錄 1. 什么是SwanLab&#xff1f; 1.1 核心特性 2. 安裝SwanLab 3. 登錄SwanLab賬號&#xff08;云端版&#xff09; 4. 5分鐘快速上手 更多案例 5. SwanLab功能組件 5.1 圖表視圖 5.2 表格視圖 5.3 硬件監控 5.4 環境記錄 5.5 組織協同 6. 訓練框架集成 6.1 基…

2025天梯訓練1

PTA | L3-1 直搗黃龍 30分 思路&#xff1a;多關鍵字最短路&#xff0c;同時還要記錄最短路徑條數。 typedef struct node{int from,d,pass,kl;bool operator<(const node &x)const{if(d!x.d) return d>x.d;if(pass!x.pass) return pass<x.pass;return kl<x.…

EasyRTC嵌入式視頻通話SDK的跨平臺適配,構建web瀏覽器、Linux、ARM、安卓等終端的低延遲音視頻通信

1、技術背景 WebRTC是一項開源項目&#xff0c;旨在通過簡單的API為瀏覽器和移動應用程序提供實時通信&#xff08;RTC&#xff09;功能。它允許在無需安裝插件或軟件的情況下&#xff0c;實現點對點的音頻、視頻和數據傳輸。 WebRTC由三個核心組件構成&#xff1a; GetUserM…