[C++初階]vector的初步理解

一、標準庫中的vector類

1.vector的介紹

1. vector是表示可變大小數組的序列容器 和數組一樣,vector可采用的連續存儲空間來存儲元素。也就是意味著可以采用下標對vector的元素進行訪問,和數組一樣高效。但是又不像數組,它的大小是可以動態改變的,而且它的大小會被容器自動處理。
2. 本質講,vector使用動態分配數組來存儲它的元素。當新元素插入時候,這個數組需要被重新分配大小,以增加存儲空間。其做法是:分配一個新的數組,然后將全部元素移到這個數組。就時間而言,這是一個代價相對來說高的任務,因為每當一個新的元素加入到容器的時候,vector并不會每次都重新分配大小。
3. vector分配空間策略:vector會分配一些額外的空間以適應可能的增長,因為存儲空間比實際需要的存儲空間更大。不同的庫采用不同的策略權衡空間的使用和重新分配。但是無論如何,重新分配都應該是對數增長的間隔大小,以至于在末尾插入一個元素的時候是在常數時間的復雜度完成的。
4. 因此,vector占用了更多的存儲空間,為了獲得管理存儲空間的能力,并且以一種有效的方式動態增長。
5. 與其它動態序列容器相比(deque, list and forward_list), vector在訪問元素的時候更加高效,在末尾添加和刪除元素相對高效。對于其它不在末尾的刪除和插入操作,效率更低。比起list和forward_list統一的迭代器和引用更好?
我們知道STL學習的三步:能用,明理,能擴展,因而我們的學習也是這個流程

2.vector的使用

記住,學stl一定一定要學會看文檔,vector文檔.vector在實際中非常的重要,在實際中我們熟悉常

見的接口就可以。

2.1?常用的構造函數

vector();

vector類的默認構造函數,構造一個沒有元素的空容器

例如:

void test()
{vector<int> v;
}

需要引用頭文件vector


vector(size_type n, const value_type& val = value_type());

構造一個vector類對象并用n個val初始化

例如:

void test()
{//vector<int> v;vector <int> v(5, 0);for (auto i : v){cout << i << " ";}
}
int main()
{test();return 0;
}

運行結果:

void test()
{//vector<int> v;vector <int> v(5, 2);for (auto i : v){cout << i << " ";}
}
int main()
{test();return 0;
}

運行結果:


拷貝構造函數

vector(const vector& x);

對于一個已有的vector容器進行拷貝,并生成一個新的容器

例如:

void test()
{//vector<int> v;vector <int> v1(5, 2);vector <int> v2(v1);for (auto i : v2){cout << i << " ";}
}

運行結果:v


使用迭代器的初始化構造

Template<class InputIterator>vector(InputIterator first, InputIterator last);

例如:

void test()
{//vector<int> v;vector <int> v1(5, 2);//vector <int> v2(v1);vector <int> v2(v1.begin(),v1.end()-1);for (auto i : v2){cout << i << " ";}
}

運行結果v:

2.2 容量操作的接口

1.size
size_type size() const;

獲取有效元素的個數

例如:

void test()
{//vector<int> v;vector <int> v1(5, 2);//vector <int> v2(v1);/*vector <int> v2(v1.begin(),v1.end()-1);*///for (auto i : v2)//{//	cout << i << " ";//}cout << v1.size();
}
int main()
{test();return 0;
}

運行結果:

2.capacity

獲取容量大小

size_type capacity() const;

例如:

void test()
{vector <int> v1(5, 2);cout << v1.capacity();
}

運行結果:

3.empty

判斷容器是否為空

bool empty() const;

例如:

?
void test()
{vector <int> v1(5, 2);vector <int> v2;cout << v1.empty() << endl;cout << v2.empty() << endl;
}?

運行結果:

4.resize
void resize (size_type n, value_type val = value_type());

將有效元素的個數修改為n,并且如果n大于原來的size,多出來的地方用val填充

如果沒有給出val,就用0填充

例如:

void test()
{vector <int> v;cout << v.size() << endl;v.resize(20);cout << v.size() << endl;for (auto i : v){cout << i << " ";}cout << endl;v.resize(30);cout << v.size() << endl;for (auto i : v){cout << i << " ";}cout << endl;v.resize(10);cout << v.size() << endl;for (auto i : v){cout << i << " ";}
}

運行結果:

5.max_size
size_type max_size() const;

返回最大大小

例如:

ps:這里push_back是尾插

void test1()
{vector <int> v;for (int i = 0; i < 100; i++) v.push_back(i);cout << v.size() << endl;
}

運行結果:

6.reserve?????
void reserve (size_type n);

改變容量大小

例如:

void test1()
{vector <int> v;cout << v.capacity() << endl;v.reserve(10);cout << v.capacity() << endl;
}

運行結果:

2.3vector的訪問及其遍歷

1.operator[]
reference operator[] (size_type n);
const_reference operator[] (size_type n) const;

用下標直接訪問

例如:

void test()
{vector <int> v(5,2);cout << v[2] << endl;
}

運行結果:

因此我們也可以通過下標去遍歷,這里就不多作演示

2.迭代器

這里大體和string類差不多

iterator begin();const_iterator begin() const;iterator end();const_iterator end() const;

迭代器,用于獲取容器中第一個元素的位置和最后一個元素的下一個位置

例如:

?
void test()
{vector <int> v = { 1,2,3,4,5,67,8,9,0,1 };vector<int>::iterator it = v.begin();while (it != v.end()){cout << *it << " ";++it;}
}?

運行結果:

3.反向迭代器

這個整體和迭代器差不多

reverse_iterator rbegin();const_reverse_iterator rbegin() const;reverse_iterator rend();const_reverse_iterator rend() const;

rbegin獲取容器中最后一個元素的位置,rend獲取容器中的第一個元素的前一個位置

例如:

?
void test()
{vector <int> v = { 1,2,3,4,5,67,8,9,0,1 };vector<int>::reverse_iterator rit = v.rbegin();while (rit != v.rend()){cout << *rit << " ";++rit;}
}?

運行結果:

4.at
reference at (size_type n);
const_reference at (size_type n) const;

返回容器中位置n處的元素的引用

例如:

void test()
{vector <int> v = { 1,2,3,4,5,67,8,9,0,1 };cout << v.at(5) << endl;for (size_t i=0;i<v.size();++i){cout << v.at(i) << " ";}
}

運行結果:

5.back
reference back();
const_reference back() const;

返回容器中最后一個元素的引用

例如:

void test()
{vector <int> v = { 1,2,3,4,5,67,8,9,0,123 };cout << v.back()<< endl;
}

運行結果:

6.front
reference front();
const_reference front() const;

返回容器中第一個元素的引用

例如:

void test()
{vector <int> v = { 1,2,3,4,5,67,8,9,0,123 };cout << v.front()<< endl;
}

運行結果:

2.4vector的增刪查改

1.push_back();
void push_back(const value_type& val);

從容器尾部插入一個元素

例如:

void test()
{vector <int> v = { 1,2,3,4,5,67,8,9,0,123 };cout << v.back()<< endl;v.push_back(99999);cout << v.back() << endl;
}

運行結果:

2.pop_back()
void test()
{vector <int> v = { 1,2,3,4,5,67,8,9,0,123 };cout << v.back()<< endl;v.pop_back();cout << v.back() << endl;
}

運行結果:

3.find()
template <class InputIterator, class T>InputIterator find(InputIterator first, InputIterator last, const T& val);

在兩個迭代器區間尋找val并返回其所在處的迭代器

例如:

void test2()
{vector<int> v = { 1,2,3,4,5,6 };for (auto i : v){cout << i << " ";}cout << endl;vector<int>::iterator it = find(v.begin(), v.end(), 3);*it = 30;for (auto i : v){cout << i << " ";}cout << endl;
}

需要注意的是,該函數并非vector的成員函數,是標準庫中的函數,多個容器共用該find函數

4.insert()
iterator insert (iterator position, const value_type& val);
void insert (iterator position, size_type n, const value_type& val);template <class InputIterator>    
void insert (iterator position, InputIterator first, InputIterator last);

在position位置插入元素

例如:

void test2()
{vector<int> v = { 1,2,3,4,5,6 };for (auto i : v){cout << i << " ";}cout << endl;vector<int>::iterator it = find(v.begin(), v.end(), 3);v.insert(it, 99999);for (auto i : v){cout << i << " ";}cout << endl;
}

運行結果:

5.earse()
iterator erase (iterator position);
iterator erase (iterator first, iterator last);

刪除position位置的元素或者 [first,last) 區間的所有元素

例如:

void test2()
{vector<int> v = { 1,2,3,4,5,6 };for (auto i : v){cout << i << " ";}cout << endl;vector<int>::iterator it = find(v.begin(), v.end(), 3);v.erase(it);for (auto i : v){cout << i << " ";}cout << endl;
}

運行結果:

6.swap()
void swap (vector& x);

交換兩個vector的數據空間

例如:

void test3()
{vector<int> v1 = { 1,2,3,4,5,6,7,8,9,0 };vector<int> v2 = { 0,9,8,7,6,5,4,3,2,1 };v1.swap(v2);for (auto i : v1){cout << i << " ";}cout << endl;
}

運行結果:

7.assign()
template <class InputIterator>  void assign (InputIterator first, InputIterator last);
void assign (size_type n, const value_type& val);

為vector指定新內容,替換其當前內容并修改size

例如:

void test2()
{vector<int> v = { 1,2,3,4,5,6 };for (auto i : v){cout << i << " ";}cout << endl;v.assign(5, 4);for (auto i : v){cout << i << " ";}cout << endl;
}

運行結果:

8.clear()
void clear();

從vector中刪除所有元素,不改變容量大小

例如:

void test2()
{vector<int> v = { 1,2,3,4,5,6 };for (auto i : v){cout << i << " ";}cout << "size:" << v.size();cout << endl;v.clear();for (auto i : v){cout << i << " ";}cout << "size:" << v.size();cout << endl;
}

運行結果:


本篇是對vector的初步理解,我們只需知道會用即可

如有錯誤,歡迎大家在評論區指出。

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

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

相關文章

災后恢復與勒索恢復的區別

災難恢復通常側重于物理基礎設施&#xff0c;如硬盤和網絡設備&#xff0c;而勒索軟件恢復則涉及數據完整性和防范網絡威脅。 BackBox 產品管理副總裁 Amar Ramakrishnan表示&#xff0c;在災難中&#xff0c;企業可能面臨硬件受損等問題&#xff0c;但在網絡安全事件中&#…

Java學習高級一

修飾符 static 類變量的應用場景 成員方法的分類 成員變量的執行原理 成員方法的執行原理 Java之 main 方法 類方法的常見應用場景 代碼塊 設計模式 單例設計模式 餓漢式單例設計模式 懶漢式單例設計模式 繼承 權限修飾符

小紅書 達芬奇:生活問答 AI 機器人

小紅書去年 9 月開始內測的生活問答 AI 機器人&#xff1a;達芬奇&#xff0c;現在可以在小紅書 APP 上用了 得益于小紅書平臺的特性&#xff0c;該助手擅長吃、住、寵、喝、學等等各類生活知識&#xff0c;目前還在搞活動&#xff0c;寫評測筆記最高得 666 元

為什么不能在foreach中刪除元素

文章目錄 快速失敗機制&#xff08;fail-fast&#xff09;for-each刪除元素為什么報錯原因分析邏輯分析 如何正確的刪除元素remove 后 breakfor 循環使用 Iterator 總結 快速失敗機制&#xff08;fail-fast&#xff09; In systems design, a fail-fast system is one which i…

合肥高新區建設世界領先科技園區政策(商務部分)申報獎勵補貼和條件材料、時間指南

一、合肥高新區建設世界領先科技園區政策&#xff08;商務部分&#xff09;申報主體 &#xff08;更多政策可以查看小編主頁方式&#xff09; 工商、稅務、統計關系均在合肥高新區&#xff0c;并在高新區持續經營。申請項目在高新區內實施、且符合政策要求的具有獨立法人資格…

網絡基礎:EIGRP

EIGRP&#xff08;Enhanced Interior Gateway Routing Protocol&#xff09;是由思科開發的一種高級距離矢量路由協議&#xff0c;結合了距離矢量和鏈路狀態路由協議的優點&#xff1b;EIGRP具有快速收斂、高效帶寬利用、負載均衡等特點&#xff0c;適用于各種規模的網絡。EIGR…

python sklearn機械學習-數據預處理

&#x1f308;所屬專欄&#xff1a;【機械學習】?作者主頁&#xff1a; Mr.Zwq??個人簡介&#xff1a;一個正在努力學技術的Python領域創作者&#xff0c;擅長爬蟲&#xff0c;逆向&#xff0c;全棧方向&#xff0c;專注基礎和實戰分享&#xff0c;歡迎咨詢&#xff01; 您…

【設計模式】策略模式(定義 | 特點 | Demo入門講解)

文章目錄 定義策略模式的結構 QuickStart | DemoStep1 | 策略接口Step2 | 策略實現Step3 | 上下文服務類Step4 | 客戶端 策略模式的特點優點缺點 定義 策略模式Strategy是一種行為模式&#xff0c;它能定義一系列算法&#xff0c;并將每種算法分別放入到獨立的類中&#xff0c…

書籍表達式得到期望結果的組成種數

題目 給定一個只由0(假)、1(真)、&(邏輯與)、|(邏輯或)和^(異或)五種組成的字符串express&#xff0c;再給定一個布爾值desired。返回express能有多少種組合方式。可以達到desired的結果。 舉例 express“1^0|0|1”,desiredfalse. 只有1^((0|0)|1)和1^(0|(0|1))的組合可…

負載均衡類型和算法解析

假如你正在設計和開發一個分布式服務系統&#xff0c;系統中存在一批能夠獨立運行的服務&#xff0c;而在部署上也采用了集群模式以防止出現單點故障。所謂集群&#xff0c;就是指將多個服務實例集中在一起&#xff0c;對外提供同一業務功能&#xff0c;也就是任意請求都可以由…

吉利銀河L6 AQS空氣質量監控系統

結論 頂配才有AQS 開啟空調且auto模式 則默認開啟AQS 無法關閉AQS AQS的作用 銀河L6 AQS觸發 和 圖標 AQS官方配置參數 官方文檔 吉利用戶手冊

開源即正義,3D軟件Blender設計指南

在當今數字化時代&#xff0c;開源軟件的崛起不僅代表著技術的發展&#xff0c;更象征著一種信息自由和技術民主的理念。其本質是集眾人之智&#xff0c;共同去完善一個軟件&#xff0c;最終使雙方互惠共贏。具體來說&#xff0c;開源的價值&#xff0c;在于打破資源壟斷&#…

Spring的事務管理、AOP實現底層

目錄 spring的事務管理是如何實現的&#xff1f; Spring的AOP的底層實現原理 spring的事務管理是如何實現的&#xff1f; 首先&#xff0c;spring的事務是由aop來實現的&#xff0c;首先要生成具體的代理對象&#xff0c;然后按照aop的整套流程來執行具體的操作邏輯&#xf…

NLP - 基于bert預訓練模型的文本多分類示例

項目說明 項目名稱 基于DistilBERT的標題多分類任務 項目概述 本項目旨在使用DistilBERT模型對給定的標題文本進行多分類任務。項目包括從數據處理、模型訓練、模型評估到最終的API部署。該項目采用模塊化設計&#xff0c;以便于理解和維護。 項目結構 . ├── bert_dat…

蘋果AI的國產大模型之爭,沒有懸念

文 | 智能相對論 作者 | 陳泊丞 蘋果終于公布了最新的AI進程。 一個月前&#xff0c;正如此前預期的那樣&#xff0c;人工智能是今年 WWDC 發布會的焦點。全程105分鐘的主題演講&#xff0c;就有40多分鐘用于介紹蘋果的AI成果。 蘋果似乎還有意玩了一把“諧音梗”&#xff…

用機器改變人類方向

1800 世紀初&#xff0c;美國迎來了工業革命&#xff0c;這是一個由技術進步推動的變革時代。新機器和制造技術的引入重塑了經濟格局&#xff0c;提高了生產效率&#xff0c;同時減少了某些領域對手工勞動的需求。因此&#xff0c;這種轉變導致了失業。 如今&#xff0c;我們看…

實現點擊按鈕導出頁面pdf

在Vue 3 Vite項目中&#xff0c;你可以使用html2canvas和jspdf庫來實現將頁面某部分導出為PDF文檔的功能。以下是一個簡單的實現方式&#xff1a; 1.安裝html2canvas和jspdf&#xff1a; pnpm install html2canvas jspdf 2.在Vue組件中使用這些庫來實現導出功能&#xff1a;…

統計信號處理基礎 習題解答11-11

題目 考慮矢量MAP估計量 證明這個估計量對于代價函數 使貝葉斯風險最小。其中&#xff1a;, &#xff0c;且. 解答 貝葉斯風險函數&#xff1a; 基于概率密度的非負特性&#xff0c;上述對積分要求最小&#xff0c;那就需要內層積分達到最小。令內層積分為&#xff1a; 上述積…

蘋果Mac電腦能玩什么游戲 Mac怎么運行Windows游戲

相對于Windows平臺來說&#xff0c;Mac電腦可玩的游戲較少。雖然蘋果設備的性能足以支持各種大型游戲&#xff0c;但由于系統以及蘋果配套服務的限制&#xff0c;很多游戲無法在Mac系統中運行。不過&#xff0c;借助虛擬機軟件&#xff0c;Mac電腦可以突破系統限制玩更多的游戲…

react中jsx的語法規則

1.react核心庫react.development.js 2.react_dom庫&#xff0c;用于支持react操作dom&#xff08;react-dom.development.js&#xff09; 3.引入bable&#xff0c;解析jsx語法的庫&#xff0c;用于將jsx轉換為js(babel.min.js) 上述三個庫是寫基礎react的基本庫 下面我將用…