STL順序容器 vector

2021-06-28 09:23:09 字數 3157 閱讀 7297

vector是乙個線性順序結構。相當於陣列,但其大小可以不預先指定,並且自動擴

展。它可以像陣列一樣被操作,由於它的特性我們完全可以將vector 看作動態數

組。 在建立乙個vector 後,它會自動在記憶體中分配一塊連續的記憶體空間進行資料

儲存,初始的空間大小可以預先指定也可以由vector 預設指定,這個大小即

capacity ()函式的返回值。當儲存的資料超過分配的空間時vector 會重新分配

一塊記憶體塊,但這樣的分配是很耗時的,在重新分配空間時它會做這樣的動作:

首先,vector 會申請一塊更大的記憶體塊;

然後,將原來的資料拷貝到新的記憶體塊中;

其次,銷毀掉原記憶體塊中的物件(呼叫物件的析構函式);

最後,將原來的記憶體空間釋放掉。

如果vector 儲存的資料量很大時,這樣的操作一定會導致糟糕的效能(這也

是vector 被設計成比較容易拷貝的值型別的原因)。所以說vector 不是在什麼情

況下效能都好,只有在預先知道它大小的情況下vector 的效能才是最優的。

vector 的特點:

(1) 指定一塊如同陣列一樣的連續儲存,但空間可以動態擴充套件。即它可以像陣列

一樣操作,並且可以進行動態操作。通常體現在push_back() pop_back() 。

(2) 隨機訪問方便,它像陣列一樣被訪問,即支援[ ] 操作符和vector.at()

(3) 節省空間,因為它是連續儲存,在儲存資料的區域都是沒有被浪費的,但是

要明確一點vector 大多情況下並不是滿存的,在未儲存的區域實際是浪費的。

(4) 在內部進行插入、刪除操作效率非常低,這樣的操作基本上是被禁止的。

vector 被設計成只能在後端進行追加和刪除操作,其原因是vector 內部的實現

是按照順序表的原理。

(5) 只能在vector 的最後進行push 和pop ,不能在vector 的頭進行push 和pop 。

(6) 當動態新增的資料超過vector 預設分配的大小時要進行記憶體的重新分配、拷

貝與釋放,這個操作非常消耗效能。所以要vector 達到最優的效能,最好在創

建vector 時就指定其空間大小。

vectors 包含著一系列連續儲存的元素,其行為和陣列類似。訪問vector中的

任意元素或從末尾新增元素都可以在常量級時間複雜度內完成,而查詢特定值的

元素所處的位置或是在vector中插入元素則是線性時間複雜度。

1.constructors 建構函式

vectorv1; //構造乙個空的vector

vectorv1( 5, 42 ); //構造了乙個包含5個值為42的元素的vector

2.operators 對vector進行賦值或比較

c++ vectors能夠使用標準運算子: ==, !=, <=, >=, <, 和》.

要訪問vector中的某特定位置的元素可以使用 操作符.

兩個vectors被認為是相等的,如果:

1.它們具有相同的容量

2.所有相同位置的元素相等.

vectors之間大小的比較是按照詞典規則.

3.assign() 對vector中的元素賦值

語法:void assign( input_iterator start, input_iterator end );

// 將區間[start, end)的元素賦到當前vector

void assign( size_type num, const type &val );

// 賦num個值為val的元素到vector中,這個函式將會清除掉為vector賦值以前的內容.

44.at() 返回指定位置的元素

語法:type at( size_type loc );//差不多等同v[i];但比v[i]安全;

5.back() 返回最末乙個元素

6.begin() 返回第乙個元素的迭代器

7.capacity() 返回vector所能容納的元素數量(在不重新分配記憶體的情況下)

8.clear() 清空所有元素

9.empty() 判斷vector是否為空(返回true時為空)

10.end() 返回最末元素的迭代器(譯註:實指向最末元素的下乙個位置)

11.erase() 刪除指定元素

語法:iterator erase( iterator loc );//刪除loc處的元素

iterator erase( iterator start, iterator end );//刪除start和end之間的元素

12.front() 返回第乙個元素的引用

13.get_allocator() 返回vector的記憶體分配器

14.insert() 插入元素到vector中

語法:iterator insert( iterator loc, const type &val );

//在指定位置loc前插入值為val的元素,返回指向這個元素的迭代器,

void insert( iterator loc, size_type num, const type &val );

//在指定位置loc前插入num個值為val的元素

void insert( iterator loc, input_iterator start, input_iterator end );

//在指定位置loc前插入區間[start, end)的所有元素

15.max_size() 返回vector所能容納元素的最大數量(上限)

16.pop_back() 移除最後乙個元素

17.push_back() 在vector最後新增乙個元素

18.rbegin() 返回vector尾部的逆迭代器

19.rend() 返回vector起始的逆迭代器

20.reserve() 設定vector最小的元素容納數量

//為當前vector預留至少共容納size個元素的空間

21.resize() 改變vector元素數量的大小

語法:void resize( size_type size, type val );

//改變當前vector的大小為size,且對新建立的元素賦值val

22.size() 返回vector元素數量的大小

23.swap() 交換兩個vector

語法:void swap( vector &from );

STL順序容器陣列之vector

向量 動態陣列 標頭檔案 include vectorvec 中放資料型別,vec是變數名 vector vec1 5 乙個大小為5的陣列 vector vec2 5,12 乙個大小為5的陣列,以12填充 定義示例 vector iterator ite 在codeblocks中定義物件時初始化了幾...

順序容器 vector

一 底層實現 vector就是動態陣列.它也是在堆中分配記憶體,元素連續存放,有保留記憶體,如果減少大小後,記憶體也不會釋放.如果新值 當前大小時才會再分配記憶體.它擁有一段連續的記憶體空間,並且起始位址不變,因此它能非常好的支援隨即訪問,即操作符,但由於它的記憶體空間是連續的,所以在中間進行插入和...

順序容器vector

vector的關鍵在於其對大小的控制以及重新配置時的資料搬移效率。由於vector維護的是乙個連續線性空間,所以不論元素類別,普通指標都可以作為vector的迭代器而滿足必要條件,包括隨機訪問 操作符 等操作行為。vector提供的是random access iterators。typedef v...