1. 程式人生 > >標準模板庫

標準模板庫

分組 訪問方式 iostream 分享 -1 一個 彈出 類型 中標

-------------------siwuxie095

在長期的編碼中,聰明的程序員們發現:有一些代碼經常碰到,

而且需求特別穩定,於是,各大公司在出售自己的 IDE 環境時,

就會把這些模板代碼打包,一起銷售

慢慢地,這些大公司之間就達成了某種共識,覺得應該把這些

涉及模板的通用代碼進一步的統一和規範,於是,大家慢慢形

成了一套 C++ 的標準模板,就是現在所看到的標準模板庫

技術分享

標準模板庫

標準模板庫,即 Standard Template Lib,簡稱為

STL

技術分享

標準模板庫所涉及的內容非常多,無法一一列舉,這裏只介紹

其中具有代表性的、最常用的部分

1)向量 vector

向量,多麽高大上的名字,大家千萬不要被它的名字所嚇倒

就其本質來說,向量就是對數組的封裝

技術分享

大家可以把它看做是一個數組,只不過相對於此前所學的傳統數組

向量這個數組的功能要強大的多,它可以根據存儲的元素個數自動

的變長 或縮短,並且它具有一個很優秀的特點,即 能夠在隨機讀取

數據的時候,在常數時間內完成,這是非常不容易的

技術分享

也就是說,無論這個向量中是存十個數據,還是存一萬個數據,它

都能夠很快的從中找出我們想要的數據

向量的初始化 定義的方法,常用的有 4 種:

技術分享

在使用時:

技術分享

第一行代碼使用的是第一種初始化的方法,初始化了一個空的向量 ivec1,

第二行代碼是用空的向量 ivec1 又去初始化了另外一個空的向量 ivec2

第三行和第四行代碼,同理只不過參數不同罷了

第五行代碼是用 10 -1 數字初始化 ivec4,而第六行代碼則是用 10

hi! 字符串來初始化 svec

向量初始化之後必須要有一些配套的使用方法,這樣程序員才能真正體會

到標準模板所帶來的方便,如下:

技術分享

在使用時:

技術分享

就像通過類模板去實例化一個模板類時一樣,需要在 vector 後面的

尖括號中傳入一個參數,這裏是 int,後面就是對象 vec 了

vec 調用 push_back() 時,就會在當前向量的尾部插入元素 10,而

調用 pop_back() 就會將這個 10 抹掉,最後打印 vec.size() 即 總共

數據的個數 0

對於數組來說,遍歷數組是一種非常常見的操作,而對於向量來說,

遍歷時可以像數組一樣去遍歷它,如下:

技術分享

除了上面的遍歷方法之外,還有一個常用的遍歷方法,

叠代器來進行遍歷

叠代器,即 iterator,通過它就可以訪問標準模板庫

對象裏的每一個元素

如:通過叠代器去遍歷向量中的每一個元素

技術分享

將向量定義為 vec,通過 vec 的 push_back() 向向量中壓入很多的元素,

並依次放在向量的尾部,當然,第一次調用時,會放在第一個元素上

向量叠代器的定義方法:

vector 後面的尖括號中標記出當前的向量所使用的數據類型,再接

一對冒號 ::,用它來標記出當前的叠代器是屬於向量的叠代器,然後是

叠代器 citer,即 citer 的數據類型是 vector<string>::iterator,然後

通過叠代器 citer 來指向當前向量 vec 的第一個元素,最後用 for 循環

就可以用叠代器 citer 去遍歷整個向量了

遍歷的方法很有意思:

1)首先作為 for 循環來說,第一個條件可以什麽都不寫

2)第二個條件,即 for 循環的截止條件 是 citer != vec.end(),其中

end() 表示當前向量 vec 的最後一個元素的下一個位置,顯然,這是

合理的

3)第三個條件 citer++ 表明:citer 作為叠代器來說,是可以通過 ++

來進行修飾的,它的意義就相當於通過一個指針又指向了向量的下一個

元素,既然可以 ++,自然也可以 --,即 指向向量的上一個元素

4)要打印當前叠代器所指向的向量的值,切記要在叠代器 citer 前

加一個 *,這樣,就指的是當前叠代器所指向的元素本身了

2)鏈表 list

鏈表的本質,即 它的數據結構,如下:

技術分享

鏈表一般由若幹結點組成,如果一個結點都沒有,稱之為 空鏈表

如果有多個結點, 把 第一個結點 稱之為 頭結點

對於每一個結點來說,又由兩部分組成:一部分是數據部分,也叫

數據域,另一部分是指針部分,也叫做 指針域,指針部分用來將

各個結點串聯起來

有一種鏈表 雙鏈表,即 不僅可以從頭找到尾,還可以從尾找到頭

對於鏈表來說,如果它想插入一個數據,如:在 D 和 E 之間插入數據,

可以讓 D 的指針域指向插入進來的數據,再讓插入進來的數據的指針

域指向 E

可見:鏈表插入數據的操作非常簡單,而向量如果想在中間插入一個

數據,那麽它其後的所有數據就要向後移一個位置,相對於鏈表來說,

就非常復雜

所以,對於鏈表來說,它的特點就是數據插入的速度比較快

技術分享

在使用方法上,鏈表與向量的使用方法基本相同,它也有 begin()

end() 等等函數,並且它也可以通過叠代器進行遍歷的訪問

(3)映射 map

關於映射,先來看一下它的數據結構,如下:

技術分享

對於映射來說,存儲的數據都是成對出現的,把它們標記為 key

value,key 稱之為 ,而 value 稱之為

key 和 value 是一對一對出現的,它們往映射這種數據結構中存

放時,也是一對一對去放的

所以在訪問時,就可以通過 來找到對應的

看如下實例:

技術分享

當通過映射 map 定義了一個對象 m 後,需要向 m 中放

若幹對 key-value

而正是通過 pair 來定義 ,即 鍵值對,再通過 m 調用

insert() 函數將 鍵值對 放入到 映射 當中去

如果想要訪問 value,就可以通過 m 接 key 的索引即可,

如:通過 m[10] 就可以訪問到 shanghai,這種訪問方式

和數組很相似

再看另一實例:

技術分享

與上例不同的是,key 不再是數字,而是字符串,通過 m["S"] 即可訪問

shanghai

程序 1:

main.cpp:

#include "stdlib.h"

#include <iostream>

#include <vector>

using namespace std;

int main(void)

{

//註意向量vector是一個首字母小寫的類型

//給一個類的參數這裏是int 再寫變量名

vector<int> vec;

//從向量的尾部插入數據

vec.push_back(3);

vec.push_back(4);

vec.push_back(6);

//cout << vec.size() << endl;//當前數據的個數

//vec.pop_back();//將尾部的數據刪除(彈出)

//cout << vec.size() << endl;

//遍歷該向量

for (int i = 0; i < vec.size();i++)

{

cout << vec[i] << endl;

}

//拿到向量的第一個元素叠代器相當於是一個指針通過指針指向第一個元素

vector<int>::iterator itor = vec.begin();

//cout << *itor << endl;//打印第一個元素

//通過叠代器遍歷向量

//vec.end();是最後一個元素的下一個位置

for (; itor != vec.end();itor++)

{

cout << *itor << endl;

}

cout << endl;

cout << vec.front() << endl;//取第一個元素

cout << vec.back() << endl;//取最後一個元素

system("pause");

return 0;

}

//向量就其本質來說其實就是數組的封裝可以看做一個數組

//只是向量這個數組相對於傳統數組來說功能要強大的多

//它可以根據存儲的元素個數自動變長或縮短

//並且具有一個很優秀的特點就是在能夠隨機讀取數據的時候

//在常數時間內完成(讀取能在常數時間內完成)

//10個或者10000個數據都能很快找出想要的數據

//

//叠代器與類相關的如果要去叠代向量當中的每一個元素

//就要通過向量的叠代器進行叠代

程序 2

main.cpp:

#include "stdlib.h"

#include <iostream>

#include <list>

#include <map>

#include <string>

using namespace std;

int main(void)

{

list<int> list1;//鏈表

list1.push_back(4);

list1.push_back(7);

list1.push_back(9);

//這種遍歷是錯誤的只能通過叠代器進行遍歷

/*for (int i = 0; i < list1.size();i++)

{

cout << list1[i] << endl;

}*/

list<int>::iterator itorx = list1.begin();

for (; itorx != list1.end();itorx++)

{

cout << *itorx << endl;

}

cout << endl << endl;

//作為映射來說存儲的數據都是成對出現的前面的是key()

//後面的是value(值)每一個元素都是一對 m是映射的對象

map<int, string> m;

pair<int, string> p1(3, "hello");//一對定義若幹對key vallue

pair<int, string> p2(6, "world");

pair<int, string> p3(9, "beijing");

//映射沒有 push_back() 方法,通過 insert() 進行插入

m.insert(p1);

m.insert(p2);

m.insert(p3);

//訪問的時候通過索引加key值的方式即通過鍵來找值

//若開始定義的映射是這樣

//map<string,string> m;

//pair<string,string> p1("H","hello"); 再插入

//訪問時就可以 m["H"] 同樣是通過鍵來找值

cout << m[3] << endl;

cout << m[9] << endl;

cout << endl << endl;

map<int, string>::iterator itor = m.begin();

for (; itor != m.end();itor++)

{

cout << itor->first << endl;//第一個key

cout << itor->second << endl;//第二個value

cout << endl;

//不能通過 cout<<*itor<<endl; 的方式訪問因為作為映射來說

//每一個元素都是一也就是一個pair

//

//其中包含一個key 一個value 如果直接通過*(星號)來指出這個

//元素的內容的話計算機是不知道該如何輸出的怎麽辦

//必須要將keyvalue分別輸出出來

//方式如上

}

system("pause");

return 0;

}

【made by siwuxie095】

標準模板庫