C 知識點 STL容器1 vector

2022-04-07 10:37:53 字數 3757 閱讀 8340

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 #include 

using

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 #include 

using

namespace

std;

vector

s;intmain()

cout

<<"

vector s 的大小是

"if(!s.empty())

cout

<<"

s 不為空

"

cout

<<"

s 為空

"

if(!s.empty())

cout

<<"

s 不為空

"

cout

<<"

s 為空

"

}

輸出結果為:

4

s 不為空

s 為空

看完這些對vector空間的操作    

我們再來看vector中的迭代器

這些玩意類似於指標

同樣可以用*和->操作

首先我們可以通過

vector::iterator it;

宣告乙個叫做it的int型別的vector迭代器

那我們這時候又不得不學兩個函式

乙個叫begin,乙個叫end

begin返回的是vector的隊首迭代器

end返回的則是vector的隊尾的後乙個元素的迭代器

基本上和指標大差不差

我們看一下**實現

#include #include 

using

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...