C++核心編程之STL

STL初識:從零開始的奇幻冒險

1 STL的誕生:一場代碼復用的革命

????????很久很久以前,在編程的世界里,開發者們每天都在重復造輪子。無論是數據結構還是算法,每個人都得從頭開始寫,仿佛在無盡的沙漠中尋找綠洲。直到有一天,C++的面向對象泛型編程思想橫空出世,帶來了復用性的曙光。于是,STL(Standard Template Library,標準模板庫)應運而生,成為了拯救開發者于水深火熱中的英雄。

2 STL基本概念:容器、算法與迭代器的三角戀

STL,全稱標準模板庫,是C++中的一把瑞士軍刀。它主要由三大核心組成:

  • 容器(Container):用來存放數據的各種數據結構,比如數組、鏈表、棧、隊列等。

  • 算法(Algorithm):用來處理數據的各種操作,比如排序、查找、遍歷等。

  • 迭代器(Iterator):容器和算法之間的橋梁,讓它們能夠無縫連接。

STL的代碼幾乎都是模板類或模板函數,這意味著你可以用一套代碼處理各種數據類型,真正做到“一次編寫,到處運行”。

3 STL六大組件:容器、算法、迭代器、仿函數、適配器、空間配置器

STL不僅僅是一個庫,它更像是一個精密的機器,由六大組件構成:

  1. 容器:各種數據結構,如vectorlistmap等,用來存放數據。

  2. 算法:各種常用的操作,如sortfindcopy等,用來處理數據。

  3. 迭代器:容器和算法之間的膠水,讓它們能夠協同工作。

  4. 仿函數:行為像函數的對象,可以作為算法的策略。

  5. 適配器:用來修飾容器、仿函數或迭代器的接口,讓它們更靈活。

  6. 空間配置器:負責內存的分配與管理,確保資源的高效利用。

這六大組件共同構成了STL的強大功能,讓開發者能夠輕松應對各種復雜的編程任務。

4 容器、算法、迭代器:STL的三劍客

容器:你可以把它想象成一個魔法背包,里面可以裝各種類型的數據。STL提供了多種容器,比如vector(動態數組)、list(鏈表)、map(映射表)等。這些容器分為兩類:

  • 序列式容器:元素按順序排列,比如vectorlist

  • 關聯式容器:元素之間沒有嚴格的物理順序,通常基于二叉樹結構,比如mapset

算法:算法就像是解決問題的魔法咒語。STL提供了大量的算法,比如sort(排序)、find(查找)、for_each(遍歷)等。算法分為兩類:

  • 質變算法:會改變容器中的元素,比如copyreplace

  • 非質變算法:不會改變容器中的元素,比如findcount

迭代器:迭代器就像是魔法棒,讓你能夠遍歷容器中的元素,而不需要知道容器的內部結構。每個容器都有自己的迭代器,迭代器的種類也很多,從簡單的輸入迭代器到功能強大的隨機訪問迭代器,應有盡有。

????????每個容器都有自己專屬的迭代器。迭代器使用非常類似于指針,初學階段我們可以先理解迭代器為指針。

迭代器種類
種類功能支持運算
輸入迭代器對數據的只讀訪問只讀,支持++、==、!=
輸出迭代器對數據的只寫訪問只寫,支持++
前向迭代器讀寫操作,并能向前推進迭代器讀寫,支持++、==、!=
雙向迭代器讀寫操作,并能向前和向后操作讀寫,支持++、--
隨機訪問迭代器讀寫操作,可以以跳躍的方式訪問任意數據,功能最強的迭代器讀寫,支持++、--、[n]、-n、<、<=、>、>=

????????常用的容器中迭代器種類為雙向迭代器隨機訪問迭代器

5 容器算法迭代器初識:從代碼中感受STL的魅力

5.1 vector存放內置數據類型

vector是STL中最常用的容器之一,你可以把它看作是一個動態數組。下面是一個簡單的例子,展示了如何向vector中插入數據并遍歷它:

  • 容器: ? ? vector
  • 算法: ? ? for_each
  • 迭代器: vector<int>::iterator
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>  // 標準算法頭文件// vector存放內置數據類型void myPrint(int val)
{cout<< val << endl;
}void test01()
{// 創建了一個vector容器,數組vector<int> v;// 向容器中插入數據v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(40);// 通過迭代器訪問容器中的數據// vector<int>::iterator itBegin = v.begin(); //起始迭代器,指向容器中第一個元素// vector<int>::iterator itEnd = v.end(); // 結束迭代器,指向容器中最后一個元素的下一個位置// // 第一種遍歷方式// while (itBegin != itEnd)// {//     cout<<*itBegin<<endl;//     itBegin++;// }// // 第二種遍歷方式   就是將上面的進行改進優化// for(vector<int>::iterator it=v.begin();it != v.end(); it++)// {//     cout<<*it<<endl;// }// 第三種遍歷方式  利用STL提供遍歷算法for_each(v.begin(), v.end(), myPrint);}int main()
{test01();system("pause");return 0;
}
5.2 Vector存放自定義數據類型

vector不僅可以存放內置數據類型,還可以存放自定義的數據類型。比如,我們可以創建一個Person類,并將其對象存入vector中:

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>  // 標準算法頭文件
#include<string>// vector存放自定義數據類型
class Person
{
public:Person(string name, int age){this->m_Name = name;this->m_Age = age;}string m_Name;int m_Age;
};void test01()
{vector<Person>v;Person p1("孫悟空", 25);Person p2("豬八戒", 15);Person p3("鐘無艷", 36);Person p4("蘭陵王", 50);Person p5("安琪拉", 18);// 向容器中添加數據v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);v.push_back(p5);// 遍歷容器數據for(vector<Person>::iterator it=v.begin(); it!=v.end();it++){// cout<<"姓名:"<< (*it).m_Name<<" 年齡:"<<(*it).m_Age<<endl;cout<<"姓名:"<< it->m_Name <<" 年齡:"<< it->m_Age <<endl;}}// 存放自定義數據類型 指針
void test02()
{vector<Person*>v;Person p1("孫悟空", 25);Person p2("豬八戒", 15);Person p3("鐘無艷", 36);Person p4("蘭陵王", 50);Person p5("安琪拉", 18);// 向容器中添加數據v.push_back(&p1);v.push_back(&p2);v.push_back(&p3);v.push_back(&p4);v.push_back(&p5);// 遍歷容器數據for(vector<Person*>::iterator it=v.begin(); it!=v.end();it++){cout<<"姓名:"<< (*it)->m_Name<<" 年齡:"<<(*it)->m_Age<<endl;// cout<<"姓名:"<< it->m_Name <<" 年齡:"<< it->m_Age <<endl;}
}int main()
{// test01();test02();system("pause");return 0;
}
5.3 Vector容器嵌套容器

STL的容器還可以嵌套使用,比如vector中可以存放另一個vector。下面是一個嵌套容器的例子:

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>  // 標準算法頭文件
#include<string>// vector容器嵌套容器
void test01()
{vector< vector<int>>v;// 創建小容器vector<int>v1;vector<int>v2;vector<int>v3;vector<int>v4;// 向小容器中添加數據for(int i=0;i<4;i++){v1.push_back(i+1);v2.push_back(i+2);v3.push_back(i+3);v4.push_back(i+4);}// 將小容器插入大容器中v.push_back(v1);v.push_back(v2);v.push_back(v3);v.push_back(v4);// 通過大容器,把所有數據遍歷一遍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()
{test01();system("pause");return 0;
}

結語:STL的奇幻之旅才剛剛開始

????????STL就像是一個充滿魔法的工具箱,里面裝滿了各種強大的工具。通過容器、算法和迭代器的組合,你可以輕松解決各種復雜的編程問題。這只是STL的入門,隨著你深入學習,你會發現它的更多神奇之處。準備好踏上這段奇幻的編程之旅了嗎?STL的世界正等著你去探索!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72203.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72203.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72203.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Python】OpenCV算法使用案例全解

OpenCV算法使用案例全解 前言 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一個開源的計算機視覺和機器學習軟件庫&#xff0c;它提供了大量的圖像和視頻處理功能。從簡單的圖像濾波到復雜的三維重建&#xff0c;OpenCV涵蓋了計算機視覺領域的眾多算…

Redis的持久化-RDBAOF

文章目錄 一、 RDB1. 觸發機制2. 流程說明3. RDB 文件的處理4. RDB 的優缺點 二、AOF1. 使用 AOF2. 命令寫?3. 文件同步4. 重寫機制5 啟動時數據恢復 一、 RDB RDB 持久化是把當前進程數據生成快照保存到硬盤的過程&#xff0c;觸發 RDB 持久化過程分為手動觸發和自動觸發。 …

Python Cookbook-2.29 帶版本號的文件名

任務 如果你想在改寫某文件之前對其做個備份&#xff0c;可以在老文件的名字后面根據慣例加上三個數字的版本號。 解決方案 我們需要編寫一個函數來完成備份工作: def VersionFile(file_spec, vtypecopy):import os,shutilif os.path.isfile(file_spec):#檢查vtype參數if v…

CCF-CSP認證 202104-1灰度直方圖

題目描述 思路 首先輸入矩陣長度、矩陣寬度和灰度范圍&#xff0c;結果數組長度可固定&#xff0c;其中的元素要初始化為0。在輸入灰度值的時候&#xff0c;結果數組中以該灰度值為索引的元素值1&#xff0c;即可統計每個灰度值的數量。 代碼 C版&#xff1a; #include <…

水果識別系統 | BP神經網絡水果識別系統,含GUI界面(Matlab)

使用說明 代碼下載&#xff1a;BP神經網絡水果識別系統&#xff0c;含GUI界面&#xff08;Matlab&#xff09; BP神經網絡水果識別系統 一、引言 1.1、研究背景及意義 在當今科技迅速發展的背景下&#xff0c;人工智能技術尤其是在圖像識別領域的應用日益廣泛。水果識別作為…

如何在網頁上顯示3D CAD PMI

在現代制造業中&#xff0c;3D CAD模型已成為產品設計和制造的核心。為了更有效地傳達設計意圖和制造信息&#xff0c;產品和制造信息&#xff08;PMI&#xff09;被嵌入到3D模型中。然而&#xff0c;如何在網頁上清晰、準確地顯示這些3D CAD PMI&#xff0c;成為了一個重要的技…

Git基本命令索引

GIT基本命令索引 創建代碼庫修改和提交代碼日志管理遠程操作操作分支 創建代碼庫 操作指令初始化倉庫git init克隆遠程倉庫git clone 修改和提交代碼 操作指令查看文件狀態git status文件暫存git add文件比較git diff文件提交git commit回滾版本git reset重命名或者移動工作…

基于Selenium的Python淘寶評論爬取教程

文章目錄 前言1. 環境準備安裝 Python&#xff1a;安裝 Selenium&#xff1a;下載瀏覽器驅動&#xff1a; 2. 實現思路3. 代碼實現4. 代碼解釋5. 注意事項 前言 以下是一個基于 Selenium 的 Python 淘寶評論爬取教程&#xff0c;需要注意的是&#xff0c;爬取網站數據應當遵守…

GenBI 可視化選誰:Python Matplotlib?HTML ?Tableau?

引言 生成式 BI(Generative BI,GenBI)通過自然語言交互和自動化內容生成,革新了數據分析和商業智能(BI)領域。用戶可以通過自然語言提問,GenBI 系統自動生成相應的 SQL 查詢、獲取數據,并以可視化圖表、表格、自然語言摘要等形式呈現分析結果。 可視化是 GenBI 的關鍵…

java后端開發day24--階段項目(一)

&#xff08;以下內容全部來自上述課程&#xff09; GUI&#xff1a;Graphical User Interface 圖形用戶接口&#xff0c;采取圖形化的方式顯示操作界面 分為兩套體系&#xff1a;AWT包&#xff08;有兼容問題&#xff09;和Swing包&#xff08;常用&#xff09; 拼圖小游戲…

vmware安裝firepower ftd和fmc

在vmware虛擬機中安裝cisco firepower下一代防火墻firepower threat defence&#xff08;ftd&#xff09;和管理中心firepower management center&#xff08;fmc&#xff09;。 由于沒有cisco官網下載賬號&#xff0c;無法下載其中鏡像。使用eveng模擬器中的ftd和fmc虛擬鏡像…

【Java進階】java設計模式之單例模式

一、單例設計模式的基本概念 在 Java 編程的廣闊天地里&#xff0c;單例設計模式宛如一顆璀璨的明星&#xff0c;是一種極為實用的創建型設計模式。它的核心使命是確保一個類在整個應用程序的生命周期內僅僅存在一個實例&#xff0c;并且為外界提供一個全局唯一的訪問點來獲取…

011 rocketmq過濾消息

文章目錄 過濾消息TAG模式過濾FilterByTagProducer.javaFilterByTagConsumer.java SQL表達式過濾FilterBySQLProducer.javaFilterBySQLConsumer.java 類過濾模式&#xff08;基于4.2.0版本&#xff09; 過濾消息 消息過濾包括基于表達式過濾與基于類模式兩種過濾模式。其中表達…

【心得】一文梳理高頻面試題 HTTP 1.0/HTTP 1.1/HTTP 2.0/HTTP 3.0的區別并附加記憶方法

面試時很容易遇到的一個問題—— HTTP 1.0/HTTP 1.1/HTTP 2.0/HTTP 3.0的區別&#xff0c;其實這四個版本的發展實際上是一環扣一環的&#xff0c;是逐步完善的&#xff0c;本文希望幫助讀者梳理清楚各個版本之間的區別&#xff0c;并且給出當前各個版本的應用情況&#xff0c;…

大模型部署與調優:從基礎到高效優化全解析

大模型部署與調優&#xff1a;從基礎到高效優化全解析 1. 引言 隨著深度學習的快速發展&#xff0c;大模型&#xff08;Large Models&#xff09; 在自然語言處理&#xff08;NLP&#xff09;、計算機視覺&#xff08;CV&#xff09;、推薦系統等領域的應用日益廣泛。然而&am…

小紅書app復制短鏈,分享鏈接轉直接可訪問鏈接

簡介&#xff1a;小紅書手機app分享的鏈接需要點擊才能獲取完成鏈接&#xff0c;本文教大家如何通過代碼的方式將xhs的短連接轉化為長鏈接。 1.正常我們分享的鏈接是這樣的&#xff1a; 44 小豬吃宵夜發布了一篇小紅書筆記&#xff0c;快來看吧&#xff01; &#x1f606; KeA…

DeepSeek 助力 Vue3 開發:打造絲滑的彈性布局(Flexbox)

前言&#xff1a;哈嘍&#xff0c;大家好&#xff0c;今天給大家分享一篇文章&#xff01;并提供具體代碼幫助大家深入理解&#xff0c;徹底掌握&#xff01;創作不易&#xff0c;如果能幫助到大家或者給大家一些靈感和啟發&#xff0c;歡迎收藏關注哦 &#x1f495; 目錄 Deep…

DeepSeek開源周Day5壓軸登場:3FS與Smallpond,能否終結AI數據瓶頸之爭?

2025年2月28日&#xff0c;DeepSeek開源周迎來了第五天&#xff0c;也是本次活動的收官之日。自2月24日啟動以來&#xff0c;DeepSeek團隊以每天一個開源項目的節奏&#xff0c;陸續向全球開發者展示了他們在人工智能基礎設施領域的最新成果。今天&#xff0c;他們發布了Fire-F…

SQL AnyWhere 的備份與恢復

目錄 一、備份 二、恢復 1、自動恢復 2、映像恢復 3、日志恢復-指定時間點 4、日志恢復-指定偏移 5、完整的恢復流程 6、恢復最佳實踐 三、其他操作 1、dbtran 2、SQL Shell 工具 數據庫的安裝與基本使用內容請參考博客: SAP SQLAnyWhere 17 的安裝與基本使用_sql…

入門基礎項目(SpringBoot+Vue)

文章目錄 1. css布局相關2. JS3. Vue 腳手架搭建4. ElementUI4.1 引入ElementUI4.2 首頁4.2.1 整體框架4.2.2 Aside-logo4.2.3 Aside-菜單4.2.4 Header-左側4.2.5 Header-右側4.2.6 iconfont 自定義圖標4.2.7 完整代碼 4.3 封裝前后端交互工具 axios4.3.1 安裝 axios4.3.2 /src…