STL vector要點及使用

2021-08-09 07:50:52 字數 4354 閱讀 4843

vector的資料安排以及操作方式,與array非常相似,兩者的唯一差別在於空間的運用的靈活性。array是靜態空間,一旦配置了就不能改變,要換大一點或者小一點的空間,可以,一切瑣碎得由自己來,首先配置一塊新的空間,然後將舊空間的資料搬往新空間,再釋放原來的空間。vector是動態空間,隨著元素的加入,它的內部機制會自動擴充空間以容納新元素。因此vector的運用對於記憶體的合理利用與運用的靈活性有很大的幫助,我們再也不必害怕空間不足而一開始就要求乙個大塊頭的array了。

vector的實現技術,關鍵在於其對大小的控制以及重新配置時的資料移動效率,一旦vector舊空間滿了,如果客戶每新增乙個元素,vector內部只是擴充乙個元素的空間,實為不智,因為所謂的擴充空間(不論多大),一如剛所說,是」配置新空間-資料移動-釋放舊空間」的大工程,時間成本很高,應該加入某種未雨綢繆的考慮,稍後我們便可以看到vector的空間配置策略。

vector維護乙個線性空間,所以不論元素的型別如何,普通指標都可以作為vector的迭代器,因為vector迭代器所需要的操作行為,如operaroe*, operator->, operator++, operator--, operator+, operator-, operator+=, operator-=, 普通指標天生具備。vector支援隨機訪問,而普通指標正有著這樣的能力。所以vector提供的是隨機訪問迭代器(random access iterators).

vector所採用的資料結構非常簡單,線性連續空間,它以兩個迭代器_myfirst和_mylast分別指向配置得來的連續空間中目前已被使用的範圍,並以迭代器_myend指向整塊連續記憶體空間的尾端。

為了降低空間配置時的速度成本,vector實際配置的大小可能比客戶端需求大一些,以備將來可能的擴充,這邊是容量的概念。換句話說,乙個vector的容量永遠大於或等於其大小,一旦容量等於大小,便是滿載,下次再有新增元素,整個vector容器就得另覓居所。

注意:

所謂動態增加大小,並不是在原空間之後續接新空間(因為無法保證原空間之後尚有可配置的空間),而是一塊更大的記憶體空間,然後將原資料拷貝新空間,並釋放原空間。因此,對vector的任何操作,一旦引起空 間的重新配置,指向原vector的所有迭代器就都失效了。這是程式設計師容易犯的乙個錯誤,務必小心。

vector建構函式

vector

v; //採用模板實現類實現,預設建構函式

vector(v.begin(), v.end());//將v[begin(), end())區間中的元素拷貝給本身。

vector(n, elem);//建構函式將n個elem拷貝給本身。

vector(const vector &vec);//拷貝建構函式。

//例子 使用第二個建構函式 我們可以...

int arr = ;

vector

v1(arr, arr +sizeof(arr) /sizeof(int));

vector常用賦值操作

assign(beg, end);//將[beg, end)區間中的資料拷貝賦值給本身。

assign(n, elem);//將n個elem拷貝賦值給本身。

vector& operator=(const vector  &vec);//過載等號操作符

swap(vec);// 將vec與本身的元素互換。

vector大小操作

size();//返回容器中元素的個數

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

resize(int num);//重新指定容器的長度為num,若容器變長,則以預設值填充新位置。如果容器變短,則末尾超出容器長度的元素被刪除。

resize(int num, elem);//重新指定容器的長度為num,若容器變長,則以elem值填充新位置。如果容器變短,則末尾超出容器長》度的元素被刪除。

capacity();//容器的容量

reserve(int len);//容器預留len個元素長度,預留位置不初始化,元素不可訪問。

vector資料訪問操作

at(int idx); //返回索引idx所指的資料,如果idx越界,丟擲out_of_range異常。

operator;//返回索引idx所指的資料,越界時,執行直接報錯

front();//返回容器中第乙個資料元素

back();//返回容器中最後乙個資料元素

vector插入和刪除操作

insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count個元素ele.

push_back(ele); //尾部插入元素ele

pop_back();//刪除最後乙個元素

erase(const_iterator start, const_iterator end);//刪除迭代器從start到end之間的元素

erase(const_iterator pos);//刪除迭代器指向的元素

clear();//刪除容器中所有元素 巧用

swap

,收縮記憶體空間

#define _crt_secure_no_warnings

#include

#include

using

namespacestd;

int main()

cout<<"capacity:"<<v.capacity()

<<endl;

cout<<"size:"<<v.size()

<<endl;

//此時 通過resize改變容器大小

v.resize(10);

cout<<"capacity:"<<v.capacity()

<<endl;

cout<<"size:"<<v.size()

<<endl;

//容量沒有改變

vector<int>(v).swap(v);

cout<<"capacity:"<<v.capacity()

<<endl;

cout<<"size:"<<v.size()

<<endl;

system("pause");

returnexit_success;

}

reserve預留空間

#define _crt_secure_no_warnings

#include

#include

using

namespacestd;

int main()

}

cout<<"count:"<<count<<endl;

system("pause");

returnexit_success;

}

STL stack要點及使用

stack是一種先進後出 first in last out,filo 的資料結構,它只有乙個出口,形式如圖所示。stack容器允許新增元素,移除元素,取得棧頂元素,但是除了最頂端外,沒有任何其他方法可以訪問stack的其他元素。換言之,stack不允許有遍歷行為。有元素推入棧的操作稱為 push,...

STL queue要點及使用

queue是一種先進先出 first in first out,fifo 的資料結構,它有兩個出口,queue容器允許從一端新增元素,從另一端移除元素。queue所有元素的進出都必須符合 先進先出 的條件,只有queue的頂端元素,才有機會被外界取用。queue不提供遍歷功能,也不提供迭代器。que...

STL vector簡單使用

參考 需要標頭檔案 include include using namespace std 尾部新增元素push back vector int vec insert value for int i 0 i 5 i vec.push back 10 i 1 輸出元素 直接當初陣列進行輸出 vecto...