C++(STL庫)之順序容器vector的使用
阿新 • • 發佈:2020-02-22
一、特點
①總的來說:可變大小陣列。支援快速隨機訪問。在尾部之外的位置插入或刪除元素可能很慢
②元素儲存在連續的記憶體空間中,因此通過下標取值非常快
③在容器中間位置新增或刪除元素非常耗時
④一旦內從重分配,和原vector相關的指標,引用,迭代器都失效。記憶體重分配耗時很長
二、標頭檔案、using宣告
- 標頭檔案:#include <vector>
- using宣告:using std::vector;
三、初始化
- vector<T> v1; ==>v1是一個空的vector
- vector<T> v2(v1); ===>v2是v1的副本,拷貝構造
- vector<T> v2=v1; ===>同上
- vector<T> v1(n,val); ===>初始化n個value
- vector<T> v1(iter1,iter2); ===>用迭代器iter1與iter2所指的區間內元素進行初始化
- vector<T> v1(n); ===>初始化n個元素,每個元素使用預設值(int為0,string為空...)
- vector<T> v1{a,b,c...}; ===>用元素a,c進行初始化
- vector<T> v1={a,c...}; ===>同上
四、相關操作
1.運算子
v1==v2;//判斷v1和v2是否相等 v1!=v2;//判斷v1和v2是否相等 >、>=、<、<= //以字典順序進行比較
2.取值
索引取值:v[0],v[1],v[2]....
五、相關函式
vector不支援push_front()和emplace_front()
v.empty();//判斷是否為空,返回布林值 v.size();//返回容器中的元素個數 v.max_size();//返回容器的容量
v.front();//得到頭元素 v.back();//得到尾元素 v.at(int i);//得到下標i處的元素,若下標越界,會丟擲異常
v1.swap(v2);//將v1和v2進行交換。容器的成員函式版本 swap(v1,v2);//同上。系統函式版本 assign(iter1,iter2);//將容器元素更換為一個迭代器的區間元素 assign(n,t);//將容器元素變為n個t元素
v.insert(iter,t);//在迭代器iter處插入t。返回所插位置處的迭代器 v.insert(v.end(),10,t);//在容器v的末尾插入10個元素,每個元素都是t。返回新新增元素的第一個元素的迭代器 v.insert(v.end(),{"a","b"...});//將後面花括號的每個元素插入容器v的尾部。返回新新增元素的第一個元素的迭代器 v.insert(v.begin(),v2.end()-2,v2.end());//將容器v2的最後兩個元素插入容器v的頭部。返回新新增元素的第一個元素的迭代器 注意:上面這個用法,後面兩個引數不能為自身容器的範圍(v.insert(v.begin(),v.end()-2,v.end());是錯誤的) //利用insert的返回值,下面程式碼為一直在lst容器的頭部插入元素(類似於push_front的功能) vector<string> v; auto iter=lst.begin(); while(cin>> word) iter=v.insert(iter,word);//insert函式每回執行完,返回容器的首元素位置
//vector不支援pop_front v.push_back(t);//尾部追加元素t v.pop_back();//刪除尾元素 v.earse(iter);//刪除迭代器iter所指位置處的元素。返回刪除位置處後一個元素迭代器 v.erase(iter1,iter2);//刪除迭代器iter1與iter2區間內的元素。返回刪除最後一個元素的後一個元素迭代器 v.clear();//清空容器,重新初始化容器
v.resize(n);//將容器v的元素變為n個。若n<原始元素個數,刪除多於元素。若n>原始元素個數,則用預設初始值初始化容器 v.resize(n,t);//將容器元素變為n個t。與容器原始個數無關 vector<int> v(5,666); v.resize(3);//v內有3個元素,都是666 v.resize(8);;//v內有8個元素,前5個個是666,後3個都是0(預設) v.resize(10,666);//v內有10個元素,都是666
//vector不支援emplace_front(); //下面的兩個函式,是在記憶體中建立一個物件,然後新增進相應的位置 v.empalce(iter,args);//在容器v的位置新增建立一個args物件 v.emplace_back(args);//在容器v的尾部新增建立一個args物件 例如 class A{ string name;int age; public: A(string name,int age); }; int main() { vector<A> v; v.emplace_back("C語言",18);//在尾部建立一個元素 v.emplace(v.begin(),"C++",18);//在容器v的頭部新增一個元素 }
v.capacity();//返回當前容器的容量(總共能存多少個) v.reserve(n);//為容器v重新分配n個記憶體空間(如果n<=當前容器大小,則什麼都不做)
六、容器操作使迭代器、引用、指標失效
1.概念:向容器中新增或者刪除元素可能會使容器的迭代器、引用、指標失效。失效的迭代器、引用、指標不再表示任何元素,使用起來非常危險
2.新增元素
- 如果vector沒有記憶體重分配。插入位置之前的元素的迭代器、引用、指標有效,插入位置之後的迭代器、引用、指標都失效
- 如果記憶體重分配,則所有的迭代器、引用、指標都失效
3.刪除元素
刪除元素之前的迭代器、引用、指標有效,之後的失效
七、vector是如何增長的
1.概念
vector是可變長的陣列,當向其中增加元素時,如果空間已滿,回自動申請一個新的空間,並將原來的空間釋放,使指向原來空間的指標指向於新空間
2.方法:vector增長是有規律的,可以通過一個公式描述
- maxSize=maxSize+((maxSize>>1)>1?(maxSize>>1):1)
- 圖解:就是由1、2、3、4、6、9...依次增長
到此這篇關於C++(STL庫)之順序容器vector的使用的文章就介紹到這了,更多相關C++ 順序容器vector內容請搜素我們以前的文章或下面相關文章,希望大家以後多多支援我們!