順序容器 vector

2021-09-26 07:58:05 字數 2570 閱讀 3628

vector與array非常相似,唯一的區別在於靈活性,陣列是靜態空間,一旦定義就不能改變,變大變小都需要客戶端自己重新配置新的空間,然後將元素從舊址搬到新址,再把原來的空間還給系統。

vector是動態空間,隨著元素的加入,他的內部機制會自行擴充空間以容納新元素。

1.vector的底層實現

vector所採用的是乙個連續的線性空間,以兩個迭代器start和finish分別指向連續空間中已被使用的空間的頭和尾,以迭代器end_of_storage指向整個連續空間的尾部(包括備用空間)。

template //vector預設使用alloca作為空間配置器

class vector

為了降低空間配置時的速度成本,vector實際配置的大小通常比客戶端的需求更大一些,以便將來可能的擴充。

2.vector的初始化

vectorv1                 // 預設初始化, 此時v1為空。

vectorv1(v2) // 執行的copy初始化,此時v1與v2的內容相同

vectorv1 = v2    // 與上面相同,都會執行copy建構函式

vectorv1(n)   // 此時v1的size大小為n ,它裡面的值是根據t的型別進行預設初始化的

vectorv1(n, a)   // v1的初始化為n個值為a的元素

vectorv1    // 列表初始化,v1內現在的元素就是a, b, c

vectorv1 =    // 列表初始化,v1內現在的元素就是a, b, c

3.vector的常用操作

temple class vector

//返回乙個指向容器第乙個元素的迭代器

iterator end() //返回乙個指向容器最後乙個元素的下乙個位置的迭代器

size_type size() const

//返回容器中已經存放的元素個數

size_type capacity() const

//返回現有的儲存容量

bool empty() const //判斷容器是否為空

reference operator(size_type n)

reference front() //返回頭部元素的引用

reference back()

除了上面說到的begin和end之外,還有rbegin和rend

v.rbegin()返回的是乙個指向容器的最後乙個元素逆序迭代器

v.end()返回的是乙個指向容器中第乙個元素的上乙個位置的逆序迭代器

檢視容器大小的操作還有max_size()和resize()

v.max_size()返回容器中可容納最多的元素個數

v.resize(n) 調整容器v的長度大小,使其能容納n個元素,若n4.vector的插入和刪除

v.push_back(t)//在容器尾部插入乙個元素t,時間複雜度為o(1)

void push_back(const t& x)

else //沒有備用空間則擴容 }

v.insert(p,x)//在迭代器p所指向的元素前插入新元素x,返回指向新元素的迭代器

iterator insert(iterator position,const t& x)

else }

v.insert(p,n,x)//在迭代器p所指向的元素前插入n個初始化為x的元素

void insert(iterator pos,int n,const t& x)

v.insert(p,f,l)//在迭代器p所指向的元素前插入f和l之間的元素

temple void insert(iterator position, inputiterator first, inputiterator last)

v.erase(p)//刪除迭代器p指向的元素,返回乙個指向被刪除元素後面的元素,

如果配置項容器的最後乙個元素,則返回的迭代器指向超出末端的下乙個位置,

如果p本身就是超出容器末端的下乙個位置,則該函式未定義

iterator erase(iterator position)

v.erase(f,l)//刪除f到l之間的所有元素,返回乙個迭代器,它指向被刪除元素段後面的元素。

如果l本身就是指向超出容器末端的下乙個位置,

則返回的迭代器也指向容器末端的下乙個位置

iterator erase(iterator f,iterator l)

v.clear()//刪除容器中能夠所有元素

v.pop_back()//刪除容器中的最後乙個元素

void pop_back()

倍數開闢更大的記憶體

舊的資料拷貝到新的記憶體

釋放舊記憶體,指向新記憶體

順序容器 vector

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

順序容器vector

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

STL順序容器 vector

vector是乙個線性順序結構。相當於陣列,但其大小可以不預先指定,並且自動擴 展。它可以像陣列一樣被操作,由於它的特性我們完全可以將vector 看作動態數 組。在建立乙個vector 後,它會自動在記憶體中分配一塊連續的記憶體空間進行資料 儲存,初始的空間大小可以預先指定也可以由vector 預...