一篇文章帶你瞭解C++(STL基礎、Vector)
STL基本概念
- STL(Standard Template Library,標準模板庫)
- STL 從廣義上分為: 容器(container) 算法(algorithm) 迭代器(iterator)
- 容器和算法之間通過迭代器進行無縫連接。
- STL 幾乎所有的代碼都采用瞭模板類或者模板函數
STL六大組件
STL大體分為六大組件,分別是:容器、算法、迭代器、仿函數、適配器(配接器)、空間配置器
- 容器:各種數據結構,如vector、list、deque、set、map等,用來存放數據。
- 算法:各種常用的算法,如sort、find、copy、for_each等
- 迭代器:扮演瞭容器與算法之間的膠合劑。
- 仿函數:行為類似函數,可作為算法的某種策略。
- 適配器:一種用來修飾容器或者仿函數或迭代器接口的東西。
- 空間配置器:負責空間的配置與管理。
STL中容器、算法、迭代器
容器: 置物之所也
- STL容器就是將運用最廣泛的一些數據結構實現出來
- 常用的數據結構:數組, 鏈表,樹, 棧, 隊列, 集合, 映射表 等
這些容器分為序列式容器和關聯式容器兩種:
- 序列式容器:強調值的排序,序列式容器中的每個元素均有固定的位置。
- 關聯式容器:二叉樹結構,各元素之間沒有嚴格的物理上的順序關系
算法 ; 問題之解法也
- 有限的步驟,解決邏輯或數學上的問題,這一門學科我們叫做算法(Algorithms)
算法分為:質變算法和非質變算法。
- 質變算法:是指運算過程中會更改區間內的元素的內容。例如拷貝,替換,刪除等等
- 非質變算法:是指運算過程中不會更改區間內的元素內容,例如查找、計數、遍歷、尋找極值等等
迭代器 : 容器和算法之間粘合劑
- 提供一種方法,使之能夠依序尋訪某個容器所含的各個元素,而又無需暴露該容器的內部表示方式。
- 每個容器都有自己專屬的迭代器
- 迭代器使用非常類似於指針,初學階段我們可以先理解迭代器為指針
迭代器種類:
種類 | 功能 | 支持運算 |
---|---|---|
輸入迭代器 | 對數據的隻讀訪問 | 隻讀,支持++、==、!= |
輸出迭代器 | 對數據的隻寫訪問 | 隻寫,支持++ |
前向迭代器 | 讀寫操作,並能向前推進迭代器 | 讀寫,支持++、==、!= |
雙向迭代器 | 讀寫操作,並能向前和向後操作 | 讀寫,支持++、–, |
隨機訪問迭代器 | 讀寫操作,可以以跳躍的方式訪問任意數據,功能最強的迭代器 | 讀寫,支持++、–、[n]、-n、<、<=、>、>= |
常用的容器中迭代器種類為雙向迭代器,和隨機訪問迭代器
容器算法迭代器初識
Vector 容器
- 容器: vector
- 算法: for_each
- 迭代器: vector<int>::iterator
Vector 三大遍歷算法
第一種方法:
vector<int>::iterator Begin = v.begin(); vector<int>::iterator End = v.end(); while (Begin != End) { cout << *Begin << endl; Begin++; }
第二種方法 :
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << endl; }
第三種方法 :
#include <algorithm> void myPrintln(int val) { cout << val << endl; } for_each(v.begin(), v.end(), myPrintln);
Vector 存放其他數據類型
存放自定義數據類型 Person
void test13() { vector<Person> v1; Person p1("花丸",16); Person p2("善子", 17); Person p3("露比", 15); v1.push_back(p1); v1.push_back(p2); v1.push_back(p3); for (vector<Person>::iterator it = v1.begin(); it != v1.end(); it++) { // *it 就是 Vector<> 內的 cout << (*it).m_Name << " " << (*it).m_Age << endl; } }
存放指針類型
void test14() { vector<Person*> v2; Person p1("小花丸", 16); Person p2("中善子", 17); Person p3("大露比", 15); v2.push_back(&p1); v2.push_back(&p2); v2.push_back(&p3); for (vector<Person*>::iterator it = v2.begin(); it != v2.end(); it++) { cout << (*it)->m_Name << " " << (*it)->m_Age << endl; } }
Vector 容器嵌套
代碼
#include <iostream> using namespace std; #include <string> #include <algorithm> #include <vector> // 知識點 : Vector 嵌套 類似於多維數組 void test15() { vector<vector<int>> v; vector<int> v1; vector<int> v2; vector<int> v3; for (int i = 0; i < 4; i++) { v1.push_back(i + 1); v2.push_back(i + 3); v3.push_back(i + 5); } v.push_back(v1); v.push_back(v2); v.push_back(v3); for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++) { // *it - > vector<int> for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); vit++) { cout << *vit << " "; } cout << endl; } } int main() { test15(); system("pause"); return 0; }
總結
本篇文章就到這裡瞭,希望能給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!