用C++寫數據結構習題也有一段時間了,不得不說STL容器對數據結構真的頗有用。php
C++ STL(Standard Template Library,標準模板庫)是一套功能強大的 C++ 模板類,其中包含4個組件,分別爲算法、容器、函數、迭代器。
因此想總結一下本身用的容器,爲何要用它以及怎麼用?算法
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;
在寫哈夫曼編碼時,須要將符號和對應的編碼一一對應存放,例如'A'=>01,'B'=>001等,在不知道map之前,要實現這樣的一一對應,有這樣兩種思路:
可是不管是哪一種,在定義和使用上都存在必定的不方便。
若是你還記得thinkphp5的教程,那你必定對數組這樣的用法並不陌生:var_dump(teacher['id'])
map就可讓數組實現這樣的一一對應:
須要引的頭文件:#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大同小異,在此不作贅述。