vector是一種容器,vector的底層是一個動態數組,裏面可以存放各種類型,使用vector時,必須包括頭文件 #include
定義vector對象的常用方法:
vector<T> v1; v1是一個空的vector,使用的默認構造函數初始化v1
vector<T> v2(V1); 用v1去初始化v2,v2包含了v1內的所有元素(直接初始化)
vector<T> v2=v1; 用v1去初始化v2,v2包含了v1內的所有元素(拷貝初始化)
把等號右側的值直接拷貝到左側的對象中 。
vector<T> v3(n,val); v3裏面放了n個重複的元素,每一個元素的值都是val
vector<T> v4(n); v4裏面放了n個重複的元素,每一個元素的值都是默認值
vector<T> v5{a,b,c,d}; v5裏面放了4個元素,每一個元素的值就是列表裏的值(列表初始化),
列表初始化的括號是花括號, 而不是圓括號。
vector<T> v5={a,b,c,d}; v6裏面放了4個元素,每一個元素的值就是列表裏的值
常用的方法:
vector<int> vec;
vec.push_back(1) 將元素1加入到vec的末尾
vec.empty() 判斷vec是否爲空,其實是通過判斷vec.size()是否爲0,爲空返回真
vec.size() 返回vec中元素的個數
vec[i] 通過下標訪問元素
vec=vec2 用vec2中的元素替換vec中的元素
vec==vec2 元素個數相同對應位置元素值相同時爲真
vec.front() 返回首元素的引用
vec.back() 返回尾元素的引用
vec.at(n) 返回下標n元素的引用
vector<value_type>::iterator iter 定義vec的迭代器,value_type爲元素的類型
vec.insert(it,t) 在迭代器it之前插入一個元素t,返回指向新添加的元素的迭代器
vec.insert(it,b,e) 在迭代器it之前插入迭代器b,e之內的元素,返回指向新添加的第一個元素的迭代器
vec.insert(it,n,t) 在迭代器it之前插入n個元素t,返回指向新添加的第一個元素的迭代器
vec.erase(it) 刪除it位置的元素,返回指向刪除元素後一個元素的迭代器
vec.erase(b,e) 刪除b,e之內的元素,返回指向刪除元素後一個元素的迭代器
vec.pop_back() 刪除尾元素,返回void
vec.clear() 刪除所有元素,返回void
vec.remove(b,e,t) 將要“刪除”元素t之後的元素移到t之前,並不是真的刪除,容器內元素的個數並未減少。就是將所有值爲t的元素移到末尾,返回值爲第一個指向值爲t的迭代器
vec.resize(n) 將vec的容器大小設爲n,注意改變的是size,若原來的大小大於n,原容器末尾的一些元素會被捨棄,若小於,則會填充默認值
vec.capacity() 返回vec的容量大小,即它最多能保存多少個元素,size是當前已經存了多少元素
vec.reserve(n) 將容量改爲n,若新容量小於原容量,多餘的內存不會釋放,若小於,則重新分配
向容器中添加或者刪除元素的操作可能使指向容器的指針、引用、迭代器失效。一個失效的指針、引用、迭代器將不再表示任何元素。
在向容器添加元素後,如果儲存空間未重新分配,指向插入位置之前的元素的迭代器、指針、引用有效,但指向插入位置之後的將會失效。
在從容器刪除元素之後,指向被刪元素之前元素的迭代器、引用、指針仍有效。尾後迭代器也就失效。
所以對容器進行操作之後,對迭代器需要更新。
1.遍歷時插入元素
iter=v.insert(iter,*iter);//想要指向下一個元素,就要跳過當前和被添加的元素
iter+=2;
2. 遍歷時刪除元素
注意:erase函數返回的就是刪除之後的元素的迭代器
iter=iter.erase(iter);
當要在訪問元素的同時改變元素的值時可以使用:
for(auto &i;vec){ 必須加引用,否則不會改變
i=i+1;
}
迭代器訪問:標準庫容器都可以使用迭代器,容器中有一個返回迭代器的成員:begin和end,任何添加或者刪除容器內的元素都會使end()失效,所以不能用變量保存end()的值,必須在每次使用時不斷調用end()函數。注意:迭代器不是指針,是類模板,表現的像指針。
auto b=vec.begin() ,e=vec.end() b指向第一個元素,注意:e指向尾元素的下一個元素,容器爲空時,b==e,指向尾元素的下一個元素
常用運算符:
*iter 返回iter所指元素的引用
iter->men 解引用iter並獲取該元素的men成員
++iter 指向iter下一個元素
--iter 指向iter上一個元素
iter1==iter2 判斷兩個迭代器是否相等
iter1!=iter2
注意++iter和iter的區別:
operator++(){ ++iter
Part++;
return Part;
}
operator++(int flag){ iter++
int temp = Part;
Part++;
return temp;
}
iter++需要創建臨時變量,它的效率不如++iter。