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

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小時,resizecapacity是不一樣的

<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;//出錯,不能訪問

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章