【C++ STL】細數C++ STL 的那些事---vector (動態陣列)
一,vector概述
vector是一個順序容器,可以存放各種型別的物件,簡單地說,vector是一個能夠存放任意型別的動態陣列,能夠增加和壓縮資料。
vector是動態空間,隨著元素的增加內部機制可以自行擴充空間,而array則是固定大小空間,如果想增加空間,需要再重新申請空間,然後將原來元素拷貝到新空間中。
【注意】vector動態增加大小,不是在原空間之後連結新空間(因為無法保證原空間之後尚有可供配置的空間),而是以原大小的兩倍另外配置一塊比較大的空間,然後將原內容拷貝過來,然後才開始在原記憶體之後構造新元素,並釋放原空間。因此對vector的任何操作,一旦引起空間重新配置,指向原vector的所有迭代器就都失效了,這是程式設計師易犯的一個錯誤,務必小心。
二,使用
建議在程式碼量不大,並且使用的名稱空間不多的情況下,使用全域性的命名域方式:using namespace std;
三,主要方法
vector<Elem> c //建立一個空的vector
vector<Elem> c1(c2) //複製一個vector
vector <Elem> c(n) //建立一個vector,含有n個數據,資料均已預設構造產生
vector <Elem> c(n,elem) //建立一個含有n個elem拷貝的vector
vector <Elem> c(beg,end) //建立一個以(beg;end)為區間的vector
c.~ vector <Elem>() //銷燬所有資料,釋放記憶體
c.assign(beg,end)
//將(beg; end)區間中的資料賦值給c
c.assign(n,elem) //將n個elem的拷貝賦值給c。
c.at(idx) //傳回索引idx所指的資料,如果idx越界,丟擲out_of_range。c.back() //傳回最後一個數據,不檢查這個資料是否存在。
c.begin() //傳回迭代器中的第一個資料地址。
c.capacity() //返回容器中資料個數。
c.clear() //移除容器中所有資料。
c.empty() //判斷容器是否為空。
c.end() //指向迭代器中末端元素的下一個,指向一個不存在元素。
c.front() //傳回第一個資料。
get_allocator //使用建構函式返回一個拷貝。 c.insert(pos,elem) //在pos位置插入一個elem拷貝,傳回新資料位置 c.insert(pos,n,elem) //在pos位置插入n個elem資料,無返回值 c.insert(pos,beg,end) //在pos位置插入在[beg,end)區間的資料。無返回值 c.max_size() //返回容器中最大資料的數量。 c.pop_back() //刪除最後一個數據。 c.push_back(elem) //在尾部加入一個數據。
c.rbegin() //傳回一個逆向佇列的第一個資料。 c.rend() //傳回一個逆向佇列的最後一個數據的下一個位置。 c.resize(num) //重新指定佇列的長度。 c.reserve() //保留適當的容量。 c.size() //返回容器中實際資料的個數。 c1.swap(c2) //將c1和c2元素互換 swap(c1,c2) //將c1和c2元素互換
operator[] //返回容器中指定位置的一個引用
四,evctor 例子
1)訪問vector中的資料 vector::at() vector::operator[] operator[]主要是為了與C語言進行相容。它可以像C語言陣列一樣操作。但at()是我們的首選,因為at()進行了邊界檢查,如果訪問超過了vector的範圍,將丟擲一個例外。由於operator[]容易造成一些錯誤,所有我們很少用它,下面進行驗證一下: 分析下面的程式碼: vector<int> v; v.reserve(10); for(int i=0; i<7; i++) { v.push_back(i); //在V的尾部加入7個數據 }try {
int iVal1 = v[7];
int iVal2 = v.at(7); } catch(const exception& e) { cout << e.what(); }
2)vector 的構造與記憶體管理 constructor , push_back()
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, char** argv) {
int i;
vector<int> iv(2,9); //首先建立有兩個元素的 vector
cout<<"size="<<iv.size()<<" "<<"capacity="<<iv.capacity()<<endl; //2 2
iv.push_back(1);//在最後插入元素 1
cout<<"size="<<iv.size()<<" "<<"capacity="<<iv.capacity()<<endl; //3 4
iv.push_back(2);//在最後插入元素 1
cout<<"size="<<iv.size()<<" "<<"capacity="<<iv.capacity()<<endl; //4 4
iv.push_back(3);//在最後插入元素 1
cout<<"size="<<iv.size()<<" "<<"capacity="<<iv.capacity()<<endl; //5 8
for(i=0;i<iv.size();++i)
cout<<iv[i]<<" "; //9 9 1 2 3
cout<<endl;
iv.pop_back();//從最後刪除元素
iv.pop_back();//從最後刪除元素
cout<<"size="<<iv.size()<<" "<<"capacity="<<iv.capacity()<<endl; //3 8 申請的空間不會收回去
for(i=0;i<iv.size();++i)
cout<<iv[i]<<" "; //9 9 1
cout<<endl;
vector<int>::iterator ivite =find(iv.begin(),iv.end(),1);//找到元素 1的位置
if(ivite != iv.end())
iv.erase(ivite); //刪除vector 中所有 值為1的元素
cout<<"size="<<iv.size()<<" "<<"capacity="<<iv.capacity()<<endl; //2 8 申請的空間不會收回去
for(i=0;i<iv.size();++i)
cout<<iv[i]<<" "; //9 9
cout<<endl;
iv.push_back(5);
iv.push_back(6);
iv.push_back(7);
iv.push_back(8);
ivite =find(iv.begin(),iv.end(),6);//找到元素 6的位置
if(ivite != iv.end())
iv.insert(ivite,3,7); //在 元素6之前 插入 3個7
for(i=0;i<iv.size();++i)
cout<<iv[i]<<" "; //9 9 5 7 7 7 6 7
cout<<endl;
cout<<"size="<<iv.size()<<" "<<"capacity="<<iv.capacity()<<endl; //9 12
iv.clear();//刪除所有元素
cout<<"size="<<iv.size()<<" "<<"capacity="<<iv.capacity()<<endl; //0 12
return 0;
}