vector可能是與各位選手見面次數最多的stl容器了
這是因為它在圖論問題中發揮的特殊而重要的作用
簡單來說vector就是乙個能根據需求改變自己長度的陣列
它有乙個空間的初始值,一旦初始值滿則向記憶體申請兩倍的空間
同樣的,它支援像陣列一樣使用下標訪問,(不是修改)
也像陣列一樣不能o(1)在任意位置插入元素(鍊錶才有這種性質)
要實現非首尾插入必須將插入位置的後面元素整體後移1才能實現
所以為保證效率,元素的插入與刪除應該在陣列尾進行
看下**實現
//如何建乙個vector
#include //
每種容器都有單獨的標頭檔案
using
namespace
std;
intmain() vector
c;
//將名為node的結構體壓入乙個vector
//結構體同樣也可以存放在vector中,這點和陣列一樣
return0;
}
建好了vector便可以對它進行操作了
首先是輸入
和陣列一樣一樣的操作
偽**就是
vector a;for(int i = 1; i <= n; i++
)cin
>>a[i];
這裡沒什麼可說的
這裡很有必要說一下
vector和陣列最大的區別就是不能修改中間元素
必須從隊尾使用bush_back函式加入新元素
用pop_back函式刪除vector最後乙個元素
像上面被刪除的偽**一樣操作會直接導致程式崩潰
來看這波**實現
#include #includeusing
namespace
std;
vector
s;int
main()
for(int j = 0; j < n; j++)
cout
<"";
return0;
}
這裡要特別注意的是
使用push_back從隊尾插入元素時
第乙個元素會預設插入a[0]中,而不是a[1]
我們講完了vector的宣告儲存和插入
再來看size,empty,和clear函式
size返回的是乙個整形,表示該vector中真實存在的元素
empty返回乙個布林,判斷該vector是否為空,bool為true則vector為空
clear則可以清空乙個vector
看下**實現
#include #includeusing
namespace
std;
vector
s;intmain()
cout
<<"
vector s 的大小是
"if(!s.empty())
cout
<<"
s 不為空
"
cout
<<"
s 為空
"
if(!s.empty())
cout
<<"
s 不為空
"
cout
<<"
s 為空
"
}
輸出結果為:
4s 不為空
s 為空
看完這些對vector空間的操作
我們再來看vector中的迭代器
這些玩意類似於指標
同樣可以用*和->操作
首先我們可以通過
vector::iterator it;
宣告乙個叫做it的int型別的vector迭代器
那我們這時候又不得不學兩個函式
乙個叫begin,乙個叫end
begin返回的是vector的隊首迭代器
end返回的則是vector的隊尾的後乙個元素的迭代器
基本上和指標大差不差
我們看一下**實現
#include #includeusing
namespace
std;
vector
s;intmain()
cout
<<*s.begin()*和對指標的意義相同
cout<<*s.end()<<
endl;
for(vector::iterator it = s.begin(); it != s.end(); it++)
cout
<<*it<<"";
return0;
}
如果你認為充分理解了這段**所傳達的含義
建議把它貼上到編譯器中執行一下
啊這第三行我們本來期望輸出此時的隊尾元素1的
卻出現了個詭異的數字
這就說明你還是沒理解(大霧
end函式返回的是隊尾的後乙個元素
此時這個元素是不存在也就是沒有被插入的
於是乎就出現了個詭異的數
要想訪問隊尾元素
我們既可以直接s[n-1]
也可以訪問*s.end()--,也就是訪問s.end()的前面內個元素(隊尾元素
還有個叫back的函式
s.back()等價於*s.end()--
(與back相對的front函式則與*s.begin()或者s[0]等價
由於我們剛才for語句中it != s.end(),
所以當it成為隊尾元素迭代器時就停止了,不會觸碰下乙個沒有被插入的節點
vector至此即可告一段落
最後來一波vector的**總成
希望讀者在自己的機器上編譯執行一下
看看是什麼效果,這些函式的作用都理解了
vector也沒有什麼難懂的了(演算法競賽領域內
#include#include
using
namespace
std;
vector
s;intmain()
cout
cout
s.pop_back();
cout
<<*s.begin()
<<*s.end()
<<*--s.end()
cout
<<*it<<"";
cout
if(!s.empty())
cout
<<"
s非空"
cout
<<"
s已空"
if(!s.empty())
cout
<<"
s非空"
cout
<<"
s已空"
}
C 知識點 STL容器3 map pair
map 和 pair 同樣屬於一種不是特別常用的的stl容器,但確實比 set 常用得多 兩者都是有兩個關鍵字的stl 且可以將 pair 型別插入 map 中 又或者說 map 就是由一堆 pair 組成的 且這些 pair 所表示的兩個資料型別分別相同 類似於變數和陣列的關係 map 物件是模板...
C 知識點 STL容器2 set
set可能算是一種比較冷門的stl容器了,喜歡用它的人覺得set真牛逼 不喜歡它的人覺得set真垃圾 很不幸,我屬於第一種 set作為一種封裝好的資料容器 最吸引人的地方是它的自動排序功能 這也就是說你可以擁有乙個實時的排好序的序列 或者可以用乙個序列同時實現大根堆和小根堆 時間複雜度和空間都是兩者...
知識點 C 中STL容器之set
零 stl目錄 1 容器之map 2 容器之vector 3 容器之set 一 前言 繼上期的vector之後,我們又迎來了另乙個類陣列的stl容器 set。二 用途與特性 set,顧名思義,集合,由數學知識可知,其內部每個元素最多出現一次。同時,系統能夠根據元素的值自動進行排序。和set一樣,mu...