c++ vector詳解

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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章