最近由於在刷劍指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 ...