vector是將元素置於一個動態數組中加以管理的容器。數組
vector能夠隨機存取元素(支持索引值直接存取, 用[]操做符或at()方法)。函數
vector尾部添加或移除元素很是快速,可是在中部或頭部插入元素或移除元素比較費時。指針
vector採用模板類實現,vector對象的默認構造形式:vector<T> vecT;code
vector<int> vecInt; //一個存放int的vector容器。 vector<float> vecFloat; //一個存放float的vector容器。 vector<string> vecString; //一個存放string的vector容器。 ... //尖括號內還能夠設置指針類型或自定義類型。 Class CA{}; vector<CA*> vecpCA; //用於存放CA對象的指針的vector容器。 vector<CA> vecCA; //用於存放CA對象的vector容器。因爲容器元素的存放是按值複製的方式進行的,因此此時CA必須提供CA的拷貝構造函數,以保證CA對象間拷貝正常。
vector(beg,end); //構造函數將[beg, end)區間中的元素拷貝給自己。注意該區間是左閉右開的區間。對象
vector(n,elem); //構造函數將n個elem拷貝給自己。索引
vector(const vector &vec); //拷貝構造函數內存
void printVector(vector<int>& v) { for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << endl; }
vector<int> vl;//默認構造 int arr[] = { 10, 20, 30, 40 }; vector<int> v2(arr, arr + sizeof(arr) / sizeof(int)); vector<int> v3(v2.begin(), v2.begin()+3); vector<int> v4(v3); vector<int> v5(4,5); printVector(v2); printVector(v3); printVector(v4); printVector(v5); /* 結果: 10 20 30 40 10 20 30 10 20 30 5 5 5 5 */
vector.assign(beg,end); //將[beg, end)區間中的數據拷貝賦值給自己。注意該區間是左閉右開的區間。ci
vector.assign(n,elem); //將n個elem拷貝賦值給自己。string
vector& operator=(const vector &vec); //重載等號操做符it
vector.swap(vec); // 將vec與自己的元素互換。
int arr[] = { 10, 20, 30, 40 }; vector<int> v1(arr, arr + sizeof(arr) / sizeof(int));//默認構造 //成員方法 vector<int> v2; v2.assign(v1.begin(), v1.end()); //重載= vector<int> v3; v3 = v2; int arr1[] = { 100, 200, 300, 400 }; vector<int> v4(arr1, arr1 + sizeof(arr) / sizeof(int));//默認構造 printVector(v1); printVector(v2); printVector(v3); printVector(v4); cout << "------------------" << endl; v4.swap(v1); printVector(v1); printVector(v2); printVector(v3); printVector(v4); /* 結果: 10 20 30 40 10 20 30 40 10 20 30 40 100 200 300 400 ------------------ 100 200 300 400 10 20 30 40 10 20 30 40 10 20 30 40 */
vector.size(); //返回容器中元素的個數
vector.empty(); //判斷容器是否爲空
vector.resize(num); //從新指定容器的長度爲num,若容器變長,則以默認值填充新位置。若是容器變短,則末尾超出容器長度的元素被刪除。
vector.resize(num, elem); //從新指定容器的長度爲num,若容器變長,則以elem值填充新位置。若是容器變短,則末尾超出容器長度的元素被刪除。
capacity();//容器的容量
reserve(int len);//容器預留len個元素長度,預留位置不初始化,元素不可訪問。
int arr1[] = { 100, 200, 300, 400 }; vector<int> v4(arr1, arr1 + sizeof(arr1) / sizeof(int));//默認構造 cout << "size:" << v4.size() << endl; if (v4.empty()) { cout << "空!" << endl; } else { cout << "不空!" << endl; } printVector(v4); v4.resize(2); printVector(v4); v4.resize(6); printVector(v4); v4.resize(8, 1); printVector(v4); for (int i = 0; i < 10000; i++) { v4.push_back(i); } cout << "size:" << v4.size() << endl; cout << "容量:" << v4.capacity() << endl;//容量不必定等於size /* 結果: size:4 不空! 100 200 300 400 100 200 100 200 0 0 0 0 100 200 0 0 0 0 1 1 size:10008 容量:12138 */
vector.push_back(); //在容器尾部加入一個元素
vector.pop_back();; //移除容器中最後一個元素
int arr1[] = { 100, 200, 300, 400 }; vector<int> v1(arr1, arr1 + sizeof(arr1) / sizeof(int));//默認構造 v1.push_back(500); v1.push_back(600); v1.push_back(700); v1.pop_back(); printVector(v1); /* 結果: 100 200 300 400 500 600100 200 300 400 500 600 */
vector.at(int idx); //返回索引idx所指的數據,若是idx越界,拋出out_of_range異常。
vector[int idx];//返回索引idx所指的數據,越界時,運行直接報錯
vector.front();//返回容器中第一個數據元素
vector.back();//返回容器中最後一個數據元素
int arr1[] = { 100, 200, 300, 400 }; vector<int> v4(arr1, arr1 + sizeof(arr1) / sizeof(int));//默認構造 //區別: at拋異常 []不拋異常 for (int i = 0; i < v4.size(); i++) { cout << v4[i] << " "; } cout << endl; for (int i = 0; i < v4.size(); i++) { cout << v4.at(i) << " "; } cout << endl; cout << "front:" << v4.front() << endl; cout << "back:" << v4.back() << endl; /* 結果: 100 200 300 400 100 200 300 400 front:100 back:400 */
vector.insert(pos,elem); //在pos位置插入一個elem元素的拷貝,返回新數據的位置。
vector.insert(pos,n,elem); //在pos位置插入n個elem數據,無返回值。
vector.insert(pos,beg,end); //在pos位置插入[beg,end)區間的數據,無返回值
vector.clear(); //移除容器的全部數據
vector.erase(beg,end); //刪除[beg,end)區間的數據,返回下一個數據的位置。
vector.erase(pos); //刪除pos位置的數據,返回下一個數據的位置。
vector<int> v; v.push_back(10); v.push_back(20); //頭插法 v.insert(v.begin(), 30); v.insert(v.end(), 40); v.insert(v.begin() + 2, 100); //vector支持隨機訪問 //支持數組下標,通常都支持隨機訪問 //迭代器能夠直接+2 +3 -2 -5操做 printVector(v); //刪除 v.erase(v.begin()); printVector(v); v.erase(v.begin() + 1, v.end()); printVector(v); v.clear(); cout << "size:" << v.size() << endl; /* 結果: 30 10 100 20 40 10 100 20 40 10 size:0 */
vector<T>(x).swap(x); //其中,x 指當前要操做的容器,T 爲該容器存儲元素的類型。
//vector添加元素 他會自動增加 你刪除元素時候,不會自動減小 vector<int> v; for (int i = 0; i < 100000; i++) { v.push_back(i); } cout << "size:" << v.size() << endl; cout << "capacity:" << v.capacity() << endl; v.resize(10); cout << "--------------" << endl; cout << "size:" << v.size() << endl; cout << "capacity:" << v.capacity() << endl; //收縮空間 vector<int>(v).swap(v); cout << "--------------" << endl; cout << "size:" << v.size() << endl; cout << "capacity:" << v.capacity() << endl; /* 結果: size:100000 capacity:138255 -------------- size:10 capacity:138255 -------------- size:10 capacity:10 */
vector的reserve增長了vector的capacity,可是它的size沒有改變!而resize改變了vector的capacity同時也增長了它的size!
緣由以下:
int num = 0; int* address = NULL; vector<int> v; v.reserve(100000); for (int i = 0; i < 100000; i++) { v.push_back(i); if (address != &(v[0])) { address = &(v[0]); num++; } } cout << "num:" << num << endl;//申請num次空間 /* 結果: num:1 */
若是一個vector使用默認的capacity,那麼在push_back操做的時候,會根據添加元素的數量,動態的自動分配空間,2^n遞增;若是聲明vector的時候,顯式的使用capacity(size_type n)來指定vector的容量,那麼在push_back的過程當中(元素數量不超過n),vector不會自動分配空間,提升程序效率。