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