vector 堆 棧 佇列的使用

2021-08-15 22:41:21 字數 3358 閱讀 2925

最近由於在刷劍指offer,所以頻繁接觸vector,之前也沒有好好學,所以把一些學到的東西記錄下來,以供自己複習,當然能幫到別人就最好不過了。

vector有很多好處,首先就是它是動態的,能改變大小,而且能存放各種型別的資料,還可以在尾部新增值,類似於鍊錶的特性,簡單來說,vector是乙個能存放任意資料型別的動態陣列,包含在標頭檔案中,在這裡插一句堆疊和佇列,棧的標頭檔案是,堆的標頭檔案是,佇列的標頭檔案是,還有雙向佇列的標頭檔案是,然後就是定義和一些操作函式。下面的例子以int型別為例,其他的都一樣。

vector:

vectorvec,vec2;

vec.begin()//指向迭代器中第乙個元素。   

vec.end()//指向迭代器中末端元素的下乙個,指向乙個不存在元素。          

vec.push_back(elem)     //在尾部加入乙個資料。  

vec.pop_back()          //刪除最後乙個資料。  

vec.capacity()  //vector可用空間的大小。  

vec.size()//返回容器中資料個數。  

vec.empty() //判斷容器是否為空。  

vec.front()     //傳回第乙個資料。  

vec.back()  //傳回最後乙個資料,不檢查這個資料是否存在。  

vec.at(index)   //傳回索引idx所指的資料,如果idx越界,丟擲out_of_range。  

vec.clear() //移除容器中所有資料。  

vec.erase(iterator) //刪除pos位置的資料,傳回下乙個資料的位置。  

vec.erase(begin,end)    //刪除[beg,end)區間的資料,傳回下乙個資料的位置。注意:begin和end為iterator  

vec.insert(position,elem)   //在pos位置插入乙個elem拷貝,傳回新資料位置。  

vec.insert(position,n,elem) //在pos位置插入n個elem資料,無返回值。  

vec.insert(position,begin,end)  //在pos位置插入在[beg,end)區間的資料,無返回值。 

assign() 對vector中的元素賦值 

get_allocator() 返回vector的記憶體分配器 

vec.max_size() 返回vector所能容納元素的最大數量(上限) 

vec.rbegin() 返回vector尾部的逆迭代器 

vec.rend() 返回vector起始的逆迭代器 

vec.reserve() 設定vector最小的元素容納數量 

vec.resize() 改變vector元素數量的大小 

swap() //交換兩個vector,用法vec.swap(vec2),vec和vec2交換,也就是vec中的所有元素到vec2中,vec2中的所有元素到vec中

關於這些函式的具體用法有個大神寫的挺好的,建議有需要的朋友可以去看下  

另外關於vector中資料的訪問,可以就用陣列的形式,比如vec[i]表示下標為i的元素,當然還可以用迭代器iterator,我會在後面的部落格中介紹iterator的詳細用法

如果想翻轉整個vector的話,有兩種辦法,一種是c++提供的函式reverse(vec.begin(),vec.end());另一種就是頭尾互換,頭尾互換也有兩種辦法,一種是用c++提供的swap函式,swap(vec[i],vec[j]);另一種就是設定乙個中間變數,然後交換,類似於temp=vec[i];vec[i]=vec[j];vec[j]=temp;

然後介紹一下上面用到的這兩個非常好用的函式,swap和reverse,兩個函式都在標頭檔案中

swap:用於交換兩個變數的值,以整型為例,int a=2,b=3;swap(a,b);

reverse:在指定的區間內翻轉陣列,這個功能真的極其好用,比如reverse(begin,end);這裡要注意的是翻轉的區間是[begin,end),是不包含end的,拿整型陣列舉個例子,int a[5]=; reverse(&a[0],&a[4]);翻轉之後陣列是,a[4]是5不在翻轉區間。當然reverse還可以用來翻轉vector,string,char型別的陣列等。

stack:先進後出(filo)

stackstk;

stk.empty()     如果棧為空返回true,否則返回false;

stk.size()     返回棧內元素的大小;

stk.pop()      從棧頂彈出乙個成員;

stk.push()     向棧內壓入乙個成員;

stk.top()      返回棧頂,但不刪除成員;

queue:先進先出(fifo)

queueque;

que.empty()      如果隊列為空返回true,否則返回false;

que.size()       返回佇列內元素的大小;

que.pop()       從佇列彈出乙個成員;

que.push()       向佇列壓入乙個成員;

que.front()      返回到隊首,但不刪除成員;

que.back()       返回到隊尾,但不刪除成員;

deque:兩端都可快速插入和刪除元素,但是訪問和迭代器操作會比vector慢一些,因為內部儲存不是乙個連續的記憶體塊。操作和 vector很相似。

dequedeq;

deq.empty()         如果隊列為空返回true,否則返回false;

deq.size()       返回佇列內元素的大小;

deq.pop_front()      從佇列首部彈出乙個成員;

deq.push_front()    從佇列首部壓入乙個成員;

deq.pop_back()           從佇列尾部彈出乙個成員;

deq.push_back()         從佇列尾部壓入乙個成員;

deq.clear()        清空佇列;

deq.begin()       指向迭代器中第乙個元素。

deq.end()            指向迭代器中末端元素的下乙個,指向乙個不存在元素。

deq.front()      返回到隊首,但不刪除成員,不檢查元素是否存在;

deq.back()        返回到隊尾,但不刪除成員,不檢查元素是否存在;

heap:

關於堆,堆並不是stl的元件,但是經常充當著底層實現結構,堆是一種完全二叉樹,stl裡面的堆操作一般只會用到以下幾個函式:

make_heap();pop_heap();push_heap();sort_heap();

關於堆有兩個大佬介紹的很清楚,有興趣學習堆的朋友可以去看下大佬的部落格:

傳送門:

佇列 堆 棧 堆疊的區別?

佇列是先進先出 就像一條路,有乙個入口和乙個出口,先進去的就可以先出去。而棧就像乙個箱子,後放的在上邊,所以後進先出。程序中每個執行緒都有自己的堆疊,這是一段執行緒建立時保留下的位址區域。我們的 棧記憶體 即在此。至於 堆 記憶體,我個人認為在未用new定義時,堆應該就是未 保留 未 提交 的自由空...

佇列 堆 棧 堆疊的區別

堆疊 先進後出 就像放在箱子的衣服,先放進去的後拿出來 佇列 先進先出 就像一條路,有乙個入口和乙個出口,先進去的就可以先出去 程序中每個執行緒都有自己的堆疊,這是一段執行緒建立時保留下的位址區域。我們的 棧記憶體 即在此。至於 堆 記憶體,我個人認為在未用new定義時,堆應該就是未 保留 未 提交...

大小堆,棧,佇列,vector點點滴滴的總結

include include using namespace std priority queue int,vector int greater int q c 內建stl的排序按top為min 同理less int n,num int a 10100 intmain int argc,char ...