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是不一樣的。
<span style="white-space:pre"> </span>vector<int> v;
v.reserve(20);
v.assign(10,2);
cout<<v.capacity()<<endl;
v.resize(21);
cout<<v.size()<<endl;
cout<<v.capacity()<<endl;
7、clear函數:
清空所有元素。
8、data函數:
返回當前容器的首元素指針,此時對於順序容器可以直接用指針進行操作了。
9、emplace()和emplace_back()函數,insert函數
emplace函數在制定迭代器前面插入一個元素,emplace_back()在容器最後插入一個元素,這個函數和push_back函數不同,push_back函數只能傳入已經構建好的對象,或者是臨時對象,容器中存放的是這個對象或者臨時對象的拷貝版本,因此會調用拷貝構造函數,如果是臨時對象,則會先調用構造函數創建一個臨時對象,然後進行拷貝構造函數構建臨時對象的拷貝版本放入容器中,因此會調用一次構造函數,一次析構函數(用於將臨時對象析構)和一次拷貝構造函數。而emplace能夠接受參數列表,直接將構造的對象放入到容器中。如果emplace接收的參數也是一個對象,則仍讓放入這個對象的拷貝版本,此時和push_back函數時一樣的。
vector<int>v;
v.reserve(100);
v.assign(10,2);
autoiter1=v.begin()+3;
autoiter2=v.begin()+5;
autoiter3=iter2+2;
v.emplace(v.begin()+5,4);//v.insert(v.begin()+5,1,4);就會使後面迭代器失效,此處iter2和iter3失效
v.insert(v.begin()+5,4);
cout<<*iter1<<endl;
cout<<*iter2<<endl;
cout<<*iter3<<endl;
emplace(iter,t)和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中元素數目成正比。
<span style="white-space:pre"> </span>vector<int>v;
v.assign(10,2);
autoiter1=v.begin()+3;
vector<int>v2;
v2.assign(10,3);
autoiter2=v2.begin()+3;
swap(v,v2);
cout<<*iter1<<" "<<*iter2<<endl;
string s1="11111111";
string s2="22222222";
autoiter3=s1.begin()+2;
autoiter4=s2.begin()+2;
swap(s1,s2);
cout<<*iter3<<" "<<*iter4<<endl;//出錯,不能訪問