vector容器概念
- vector是表示可變大小數組的序列容器。
- 就像數組一樣,vector也采用的連續存儲空間來存儲元素。也就是意味著可以采用下標對vector的元素 進行訪問,和數組一樣高效。但是又不像數組,它的大小是可以動態改變的,而且它的大小會被容器自 動處理。
- 本質講,vector使用動態分配數組來存儲它的元素。當新元素插入時候,這個數組需要被重新分配大小 為了增加存儲空間。其做法是,分配一個新的數組,然后將全部元素移到這個數組。就時間而言,這是 一個相對代價高的任務,因為每當一個新的元素加入到容器的時候,vector并不會每次都重新分配大 小。
- vector分配空間策略:vector會分配一些額外的空間以適應可能的增長,因為存儲空間比實際需要的存 儲空間更大。不同的庫采用不同的策略權衡空間的使用和重新分配。但是無論如何,重新分配都應該是 對數增長的間隔大小,以至于在末尾插入一個元素的時候是在常數時間的復雜度完成的。
- 因此,vector占用了更多的存儲空間,為了獲得管理存儲空間的能力,并且以一種有效的方式動態增 長。
- 與其它動態序列容器相比(deques, lists and forward_lists), vector在訪問元素的時候更加高效,在 末尾添加和刪除元素相對高效。對于其它不在末尾的刪除和插入操作,效率更低。比起lists和 forward_lists統一的迭代器和引用更好。
vector容器注意事項
所謂動態增加大小,并不是再原空間之后續新空間(因為無法保證原空間之后尚有可配置的空間),而是一塊更大的內存空間,然后將原數據拷貝空間,并釋放原空間。因此,對vector的任何操作,一旦引起空間的重新配置,指向vector所有迭代器就都失效了。
vector構造函數
vector賦值操作
vector大小操作
vector數據存取操作
vector插入和刪除操作
#include<iostream>
#include<vector>
#include<string>
#include<list>
using namespace std;void test01()
{vector<int>v;for (int i = 0; i < 10; i++){v.push_back(i);cout << v.capacity() << endl;//v.capacity()容器的容量}}/**/void printVector(vector<int>&v)
{for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;}void test02()
{vector<int >v;int arr[] = { 2, 3, 4, 1, 9 };vector<int>v1(arr, arr + sizeof(arr) / sizeof(int));vector<int >v2(v1.begin(), v1.end());printVector(v2);vector<int>v3(10, 100);printVector(v3);//賦值使用vector<int>v4;v4.assign(v3.begin(), v3.end());printVector(v4);v4.swap(v2);cout << "交換后的v4" << endl;printVector(v4);cout << "v4容器的大小" << v4.size() << endl;if (v4.empty()){cout << "v4空" << endl;}else{cout << "v4不空" << endl;}///v4 23419v4.resize(10,-1);//第二個參數是默認值,默認0printVector(v4);v4.resize(3);printVector(v4);
}//巧用swap收縮空間
void test03()
{vector<int >v;for (int i = 0; i < 100000; i++){v.push_back(i);}cout << "v的容量" << v.capacity() << endl;cout << "v的大小" << v.size() << endl;v.resize(3);cout << "v的容量" << v.capacity() << endl;cout << "v的大小" << v.size() << endl;//巧用swapvector<int>(v).swap(v);cout << "v的容量" << v.capacity() << endl;cout << "v的大小" << v.size() << endl;}
//reserve(int len).//容器預留len個元素長度,預留位置不初始化,元素不可訪問void test04()
{vector<int>v;v.reserve(100000);//預留出空間int *p = NULL;int num = 0;for (int i = 0; i < 100000; i++){v.push_back(i);if (p != &v[0]){p = &v[0];num++;}}cout << num << endl;//開辟100000數據用了多少次
}void test05()
{vector<int >v;v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(50);cout << "v的front" << v.front() << endl;cout << "v的front" << v.back() << endl;v.insert(v.begin(), 2,100);//參數1 迭代器 參數2 個數n 參數3 具體插入的內容printVector(v);v.pop_back();//尾刪printVector(v);v.erase(v.begin());//刪除printVector(v);//v.erase(v.begin(), v.end());v.clear();//清空所有數據if (v.empty()){cout << "為空" << endl;}}void test06()
{//逆序遍歷vector<int>v;for (int i = 0; i < 10; i++){v.push_back(i);}printVector(v);//reverse_iterator 逆序的迭代器for (vector<int>::reverse_iterator it = v.rbegin(); it != v.rend(); it++){cout << *it << " ";}cout << endl;//vector迭代器是隨機訪問的迭代器 支持跳躍式訪問vector<int>::iterator itBegin = v.begin();itBegin = itBegin + 3;//如果上述寫法不報錯,這個迭代器是隨機訪問迭代器list<int>l;for (int i = 0; i < 10; i++){l.push_back(i);}list<int>::iterator lIt = l.begin();//lIt = lIt + 1;//不支持隨機訪問}int main()
{//test01();//test02();//test03();//test04();//test05();test06();system("pause");return 0;
}