一篇文章帶你了解C++(STL基礎(chǔ)、Vector)
STL基本概念
- STL(Standard Template Library,標(biāo)準(zhǔn)模板庫)
- STL 從廣義上分為: 容器(container) 算法(algorithm) 迭代器(iterator)
- 容器和算法之間通過迭代器進(jìn)行無縫連接。
- STL 幾乎所有的代碼都采用了模板類或者模板函數(shù)
STL六大組件
STL大體分為六大組件,分別是:容器、算法、迭代器、仿函數(shù)、適配器(配接器)、空間配置器
- 容器:各種數(shù)據(jù)結(jié)構(gòu),如vector、list、deque、set、map等,用來存放數(shù)據(jù)。
- 算法:各種常用的算法,如sort、find、copy、for_each等
- 迭代器:扮演了容器與算法之間的膠合劑。
- 仿函數(shù):行為類似函數(shù),可作為算法的某種策略。
- 適配器:一種用來修飾容器或者仿函數(shù)或迭代器接口的東西。
- 空間配置器:負(fù)責(zé)空間的配置與管理。
STL中容器、算法、迭代器
容器: 置物之所也
- STL容器就是將運(yùn)用最廣泛的一些數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)出來
- 常用的數(shù)據(jù)結(jié)構(gòu):數(shù)組, 鏈表,樹, 棧, 隊(duì)列, 集合, 映射表 等
這些容器分為序列式容器和關(guān)聯(lián)式容器兩種:
- 序列式容器:強(qiáng)調(diào)值的排序,序列式容器中的每個(gè)元素均有固定的位置。
- 關(guān)聯(lián)式容器:二叉樹結(jié)構(gòu),各元素之間沒有嚴(yán)格的物理上的順序關(guān)系
算法 ; 問題之解法也
- 有限的步驟,解決邏輯或數(shù)學(xué)上的問題,這一門學(xué)科我們叫做算法(Algorithms)
算法分為:質(zhì)變算法和非質(zhì)變算法。
- 質(zhì)變算法:是指運(yùn)算過程中會(huì)更改區(qū)間內(nèi)的元素的內(nèi)容。例如拷貝,替換,刪除等等
- 非質(zhì)變算法:是指運(yùn)算過程中不會(huì)更改區(qū)間內(nèi)的元素內(nèi)容,例如查找、計(jì)數(shù)、遍歷、尋找極值等等
迭代器 : 容器和算法之間粘合劑
- 提供一種方法,使之能夠依序?qū)ぴL某個(gè)容器所含的各個(gè)元素,而又無需暴露該容器的內(nèi)部表示方式。
- 每個(gè)容器都有自己專屬的迭代器
- 迭代器使用非常類似于指針,初學(xué)階段我們可以先理解迭代器為指針
迭代器種類:
種類 | 功能 | 支持運(yùn)算 |
---|---|---|
輸入迭代器 | 對數(shù)據(jù)的只讀訪問 | 只讀,支持++、==、!= |
輸出迭代器 | 對數(shù)據(jù)的只寫訪問 | 只寫,支持++ |
前向迭代器 | 讀寫操作,并能向前推進(jìn)迭代器 | 讀寫,支持++、==、!= |
雙向迭代器 | 讀寫操作,并能向前和向后操作 | 讀寫,支持++、–, |
隨機(jī)訪問迭代器 | 讀寫操作,可以以跳躍的方式訪問任意數(shù)據(jù),功能最強(qiáng)的迭代器 | 讀寫,支持++、–、[n]、-n、<、<=、>、>= |
常用的容器中迭代器種類為雙向迭代器,和隨機(jī)訪問迭代器
容器算法迭代器初識(shí)
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 存放其他數(shù)據(jù)類型
存放自定義數(shù)據(jù)類型 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<> 內(nèi)的 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> // 知識(shí)點(diǎn) : Vector 嵌套 類似于多維數(shù)組 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; }
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
c++ qsort 與sort 對結(jié)構(gòu)體排序?qū)嵗a
這篇文章主要介紹了c++ qsort 與sort 對結(jié)構(gòu)體排序?qū)嵗a,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下2020-11-11QT如何通過鼠標(biāo)事件實(shí)現(xiàn)圖片的拖動(dòng)和縮放
本文介紹了如何通過鼠標(biāo)拖動(dòng)移動(dòng)圖片以及使用鼠標(biāo)滾輪進(jìn)行圖片縮放的技術(shù)實(shí)現(xiàn),包括完整的解決方案,ImageWidget.h、ImageWidget.cpp和main.cpp的編寫,以及詳細(xì)的函數(shù)解釋,如paintEvent()重繪圖片,以及平滑縮放和偏移量的應(yīng)用等,需要的朋友可以參考下2024-10-10基于C語言實(shí)現(xiàn)的貪吃蛇游戲完整實(shí)例代碼
這篇文章主要介紹了基于C語言實(shí)現(xiàn)的貪吃蛇游戲完整實(shí)例代碼,對于學(xué)習(xí)游戲開發(fā)的朋友有一定的借鑒價(jià)值,需要的朋友可以參考下2014-08-08

vs2022?qt環(huán)境搭建調(diào)試的方法步驟