vector的所有函式和使用的注意事項

2021-06-30 16:37:54 字數 3274 閱讀 9812

1、建構函式:

(1)vector<> v;預設建構函式

(2)vector<> v1(v)或v1=v;拷貝建構函式

(3)vector<> v2(v.begin(),v.end());用迭代器作為引數

(4)vector<> v3(n);用n指出物件個數

(5)vector<> v4(n,t);初始化n個物件,每個物件用t初始化

(6)vector<> v5{}或v5={};用初始化列表初始化,這是c++11標準,vs2010不可以

2、assign函式:(只有順序容器有)

assign函式可以對已有容器進行重新賦值,可以改變原來容器的size和capacity。建構函式只能用相同容器型別和相同元素型別進行初始化,而assign可以用不同的容器型別和元素型別,只要元素可以進行隱式型別轉換即可。assign

後會使當前呼叫

assign

的容器的迭代器失效。

3、at函式:

at函式用來訪問容器中下標為i的元素,此時如果越界,則會丟擲out-of-range異常,而普通的下標訪問不會丟擲異常,會引起執行時錯誤。

4、back和front函式:

back返回容器最後乙個元素的引用,front返回容器第乙個元素的引用。注意此時要保證容器是非空的。

5、begin,cbegin,rbegin,end,cend,rend:

返回迭代器,其中cbegin返回const迭代器,rbegin返回容器最後乙個元素的迭代器,注意不是end,而rend返回第乙個元素前面的迭代器,rbegin++相當於--end。其它類似。

6、capacity和reserve,size和resize:

capacity()是表示當前容器最多能存放多少元素而不重新開闢空間,reserve()表示要對當前容器預留多少元素,其改變的是capacity,如果reserve(n),n比原來的capacity大,則重新分配空間,如果小,則不重新分配,capacity也不改變。

size()返回當前容器中的元素個數,resize(n,t)會改變size,如果n比size大,則剩下的部分用元素t來填充,如果小,則直接刪除掉多餘的元素,呼叫resize()增大size後有可能會是capacity變化。刪除元素後,如果原來迭代器在刪除的元素個數之前,迭代器不失效,如果迭代器指向

n以後的元素,迭代器失效。當

n小時,

resize

和capacity

是不一樣的。

vectorv;

v.reserve(20);

v.assign(10,2);

cout<

清空所有元素。

8、data函式:

返回當前容器的首元素指標,此時對於順序容器可以直接用指標進行操作了。

9、emplace()和emplace_back()函式,insert函式

emplace函式在制定迭代器前面插入乙個元素,emplace_back()在容器最後插入乙個元素,這個函式和push_back函式不同,push_back函式只能傳入已經構建好的物件,或者是臨時物件,容器中存放的是這個物件或者臨時物件的拷貝版本,因此會呼叫拷貝建構函式,如果是臨時物件,則會先呼叫建構函式建立乙個臨時物件,然後進行拷貝建構函式構建臨時物件的拷貝版本放入容器中,因此會呼叫一次建構函式,一次析構函式(用於將臨時物件析構)和一次拷貝建構函式。而emplace能夠接受引數列表,直接將構造的物件放入到容器中。如果emplace接收的引數也是乙個物件,則仍讓放入這個物件的拷貝版本,此時和push_back函式時一樣的。

vectorv;

v.reserve(100);

v.assign(10,2);

autoiter1=v.begin()+3;

autoiter2=v.begin()+5;

autoiter3=iter2+2;

v.emplace(v.begin()+5,4);就會使後面迭代器失效,此處iter2和iter3失效

v.insert(v.begin()+5,4);

cout<<*iter1和insert(iter,t)

只有vector

容器空間足夠,都不會改變迭代器,但是用

insert(iter,n,t)

就會使插入元素及其後面的迭代器失效。而對於

deque

來說,除了在首尾位置插入外,其他地方插入都會使迭代器失效!!

同樣emplace_back

在不改變容器

capacity

的情況下所有迭代器都有效。

注意deque沒有capacity函式,因為其實動態分配記憶體,且記憶體不一定連續,裡面維護這乙個指標陣列。

10、empty函式:

返回bool型別,判斷容器是否為空。

11、erase函式:

刪除制定迭代器位置的元素,或者刪除由兩個迭代器制定的區間的元素。刪除位置的迭代器和其後的迭代器都失效。

12、max_size函式:

返回容器最多能夠容納的物件個數,vs2010中是1073741823,即2^30。

13、push_back和pop_back函式:

push_back()和pop_back()函式會使end迭代器失效,即插入位置和刪除位置的迭代器會失效。

14、shrink_to_fit函式:

將capacity縮減至size大小,但是,具體的實現可以選擇忽略此請求,也就是說,呼叫shrink_to_fit也並不保證一定退回記憶體空間。

15、swap函式:

除array

外,swap

不對任何順序容器的元素進行拷貝、刪除或插入操作,因此可以保證在常數時間內完成。除

string

外,指向容器的迭代器、引用和指標在

swap

操作以後多不會失效。它們仍然指向

swap

操作之前所指向的那些元素,只是在

swap

後,這些元素已經屬於不同容器了。對於乙個

string

呼叫swap

會導致迭代器、引用和指標失效。

swap

兩個array

會真正交換它們的元素。因此交換兩個

array

所需要的時間與

array

中元素數目成正比。

vectorv;

v.assign(10,2);

autoiter1=v.begin()+3;

vectorv2;

v2.assign(10,3);

autoiter2=v2.begin()+3;

swap(v,v2);

cout<<*iter1<<" "<<*iter2<

vector中函式的使用

容器 container 可容納一些資料的模板類,stl中有vector set map multimap和deque等容器。游標 iterator 是乙個指標,用來指向stl容器中的元素。includevector屬於std命名域的,使用全域性的命名域方式 using namespace std ...

vector建構函式的使用

vector容器提供了很多個建構函式,有的建構函式同時也提供了初始化或賦值功能,這很大程度上方便了我們構造vector物件,下面是我們常用的5種建構函式。1.vector 說明 無參建構函式,構造乙個vector物件,但未進行初始化,此時元素個數為0。2.vector size type num 說...

vector和list的使用

1.vector為儲存的物件分配一塊連續的位址空間,因此對vector中的元素隨機訪問效率很高。在vecotor中插入或者刪除某個元素,需要將現有元素進行複製,移動。如果vector中儲存的物件很大,或者建構函式複雜,則在對現有元素進行拷貝時開銷較大,因為拷貝物件要呼叫拷貝建構函式。對於簡單的小物件...