C++ STL容器总结之vector(超详细版)
一、vector簡介
vector的中文翻譯為向量,是一種C++ STL中的序列容器。它的是存儲方式和C++語言本身提供的數(shù)組一樣都是順序存儲,因此vector的操作和數(shù)組十分相似。但是和數(shù)組不一樣的是,數(shù)組的存儲空間是靜態(tài)的,一旦配置了就不能改變,而vector的存儲空間是動態(tài)的,隨著元素的加入,它的內(nèi)部機(jī)制會自動擴(kuò)充空間以容納新元素,因此也被稱為可變長數(shù)組。
二、vector存儲機(jī)制
vector的動態(tài)空間實(shí)現(xiàn)如下圖所示,
為了減少空間配置的時(shí)間代價(jià),通常vector配置的空間會比我們標(biāo)注的需求量更大一些,于是vector總的存儲空間就如上圖所示分成了兩部分,其中工作空間是按我們標(biāo)注的需求配置的,而備用空間就是額外配置的那一部分空間。
當(dāng)需要擴(kuò)充的新的空間時(shí),vector會優(yōu)先使用備用空間。例如我們現(xiàn)在要在末尾插入6,它會將 finishfinishfinish 迭代器指向的空間用于存儲6,最后再調(diào)整 finishfinishfinish 迭代器的位置。
當(dāng)備用空間不足以存放要插入的元素時(shí),vector會在另外較大的空閑空間中配置一塊大小為原來兩倍的新空間(由于不能保證原空間之后有足有的空閑空間,所以并不是直接在原空間后面接續(xù)),然后將原空間中的數(shù)據(jù)按順序遷移到新空間,最后釋放原來的存儲空間。這一過程可以簡單記憶為重新配置、移動數(shù)據(jù)、釋放原空間。
下面是以“在備用空間用完的情況下插入新元素3”為例,用圖片形式描述前后的存儲空間變化。
由于以上過程對使用者而言都是透明的,所以需要非常注意的一點(diǎn)是,一旦vector的空間重新配置,所有指向原vector的迭代器都會失效!
三、vector創(chuàng)建和初始化
初始化比較簡單,我們可以根據(jù)自己的使用需求來相應(yīng)的初始化方法。
//vector頭文件 #include <vector> //創(chuàng)建一個(gè)空的vector vector<int> vec1; //創(chuàng)建一個(gè)有n個(gè)元素的vector,初始值都為0 vector<int> vec2(n); //創(chuàng)建一個(gè)有n個(gè)元素的vector,并將它們值都初始化為x vector<int> vec3(n, x); //用vec3來初始化vec4,它們大小和元素的值都相同 vector<int> vec4(vec3);四、vector基本操作詳解
很多人不明白為什么要了解容器本身實(shí)現(xiàn)的原理,覺得學(xué)會怎么用就夠了。其實(shí),學(xué)了容器的實(shí)現(xiàn)原理會對容器操作會有更加深刻的理解,同時(shí)也會對算法思想有或多或少的領(lǐng)悟。
接下來,我們結(jié)合這張底層存儲示意圖仔細(xì)分析vector的基本操作。
- 迭代器
這里簡單介紹下面將出現(xiàn)的兩種比較陌生的迭代器:- reverse_iteratorreverse\_iteratorreverse_iterator,稱為反向迭代器,它的遞增方向和我們常用的 iteratoriteratoriterator 相反,例如 rit++rit++rit++表示指向的位置往左移。
- const_iteratorconst\_iteratorconst_iterator,它不能改變所指向的元素的值,但是可以再指向其他元素,和const關(guān)鍵詞標(biāo)注的 iteratoriteratoriterator 剛好相反。
- 容量
- 元素訪問
因?yàn)関ector也是順序存儲,所以它進(jìn)行元素的隨機(jī)訪問的時(shí)間復(fù)雜度也為 O(1)O(1)O(1)
- 修改操作操作
由于是順序存儲結(jié)構(gòu),隨機(jī)插入或隨機(jī)刪除都會引起元素的移動(對末尾元素操作除外),因此它們的時(shí)間復(fù)雜度都是 O(n)O(n)O(n)。下圖是刪除元素的底層實(shí)現(xiàn)示意,可以用于幫助我們的理解,從圖中也可以看出刪除操作不會引起總空間的變化。
- 遍歷操作
- 查找操作
這個(gè)操作主要是利用STL提供的 findfindfind 函數(shù)。
- 排序和翻轉(zhuǎn)
主要是調(diào)用STL提供的 sortsortsort 和 reversereversereverse 函數(shù)。
五、參考資料
既然都看到就這里了(我也終于寫到這里了),希望你可以做到下面三點(diǎn)哦:
- 點(diǎn)贊,這是對作者辛苦寫作的最低成本的鼓勵。
- 答應(yīng)我,把它學(xué)會!(別扔進(jìn)收藏夾吃灰)
- 可以考慮關(guān)注一波,STL系列的文章會持續(xù)更新。
總結(jié)
以上是生活随笔為你收集整理的C++ STL容器总结之vector(超详细版)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: L2-003 月饼-团体程序设计天梯赛G
- 下一篇: Shell - 脚本实现控制台一键编译运