C++ STL中的容器

用C++寫數據結構習題也有一段時間了,不得不說STL容器對數據結構真的頗有用。php

C++ STL(Standard Template Library,標準模板庫)是一套功能強大的 C++ 模板類,其中包含4個組件,分別爲算法、容器、函數、迭代器。

因此想總結一下本身用的容器,爲何要用它以及怎麼用?算法

vector(向量):強化版數組

C/C++原生的數組最討厭的就是——每次定義一個數組以前,我都要規定好它的大小。thinkphp

然而天知道個人數組到底會存放多少內容,因此,爲了能讓個人數組大小夠用,不得不把數組寫得足夠大,以下:數組

int a[9999];

剛學C語言時個人數組常常就是這樣定義的,用醜而low來形容一點也不爲過,我相信很多人到如今也是這樣寫的。
直到趕上了vector,它的第一個吸引個人地方就是——不用再爲分配數組大小而困擾了,它是一種動態數組,簡單來講就是想要何時有多大就有多大的數組(若是你機器的內存足夠大)數據結構

用法

須要引的頭文件:#include<vector>
注意:引完頭文件後須要using namespace std;函數

1.基本用法:thinkphp5

// 定義
int old[10]; // 傳統定義數組的方法
vector<int> new; // 定義的大小爲0的vector容器

// 添加元素
old[0] = 1;// 將數組0號位置元素賦值爲1
new.push_back(1);// 向vector最後添加一個數據爲1的元素

// 讀取元素
cout << old[0];
cout << new[0];

// 修改元素
old[0] = 10;
new[0] = 10;
   
// 刪除最後一個元素
new.pop_back();

能夠看到,vector的讀取和修改數據元素和數組的操做仍是同樣的。編碼

2.經常使用操做spa

預備知識:設計

vector<int> new(10);// 定義一個大小爲10的vector容器
vector<int>::iterator it = new.begin();// 定義一個vector容器的迭代器,初始迭代項爲第一個元素

這裏的迭代器,至關於指向容器某個元素的一個指針,至關於以下語句:

int old[10];
int * it = old;

只有理解了迭代器的概念,下面的操做才能會用

例如,容器內此時有三個數據:1, 3, 5,利用上面定義迭代器,能夠實現以下操做:

// 向指定位置前插入元素
new.insert(it + 1, 10);

結果容器中的元素變爲:1, 10, 3, 5

// 刪除指定位置元素
new.erase(it + 2);

結果容器中的元素變爲:1, 10, 5

// 使用下標遍歷
for(int i = 0; i < new.size(); i++)
{
    cout << new[i];
}
// 使用迭代器遍歷
for(;it != new.end(); it++)
{
    cout << (*it);
}

容器的數據元素不光能夠是int,double,char這些基本數據類型,也能夠是結構體,類,以下:

class Teacher
{
    int id;
    string name;   
};

vector<Teacher> teachers;

map:鍵值對

在寫哈夫曼編碼時,須要將符號和對應的編碼一一對應存放,例如'A'=>01,'B'=>001等,在不知道map之前,要實現這樣的一一對應,有這樣兩種思路:

  1. 定義兩個數組,經過下標一一對應

clipboard.png

  1. 新建一個對象數組,每一個對象中都有character和code這兩個屬性

clipboard.png
可是不管是哪一種,在定義和使用上都存在必定的不方便。
若是你還記得thinkphp5的教程,那你必定對數組這樣的用法並不陌生:var_dump(teacher['id'])
map就可讓數組實現這樣的一一對應:

clipboard.png

用法

須要引的頭文件:#include<map>
1.基本用法

map<char, string> hafucode;// 聲明一個鍵爲char類型,值爲string類型的map容器

簡單解釋一下鍵(key)和值(value),以這條語句爲例teacher['A'] = 01,[]中的就是鍵,而01就是值,二者一一對應

// 單個插入數據
hafucode['A'] = "01"; // 向容器內插入鍵爲'A',值爲"01"的鍵值對

// 讀取數據
cout << hafucode['A']; // 輸出結果爲01

// 根據鍵查詢,找到返回指向該鍵的迭代器,不然返回指向end的迭代器
map<char, string>::iterator it;
it = hafucode.find('A');

// 修改數據
hafucode['A'] = "00";

// 刪除鍵爲A的元素
hafucode.erse('A');

其餘操做與vector大同小異,在此不作贅述。

總結

  1. STL的容器除了vector和map,還有list,set,deque,queue,stac等等,只要掌握了其中一兩個容器的用法,其餘容器的操做也就很容易就上手了
  2. 善用STL中的各類容器及算法,會極大地簡化程序的設計,而把主要精力用於算法的實現上來。
相關文章
相關標籤/搜索