C++基礎語法:STL之容器(1)--容器概述和序列概述

前言

? ? ? ?"打牢基礎,萬事不愁" .C++的基礎語法的學習

引入?

? ? ? ? STL是標準模板庫,類模板主要是用來做容器的,所以個人理解:標準模板庫是"標準容器庫".容器是STL的核心 .以<C++ Prime Plus> 6th Edition(以下稱"本書")內容理解容器.

類模板內容回顧

?????????類模板把數據類型---class類型或基本類型作為參數傳入,設類型為T,則可以把T*(指針),T**(雙重指針),?T a[](數組)作為類模板屬性

容器概念

? ? ? ? 本書內容解讀

? ? ? ? 寫在前面的話:本節所有的"容器"都要替換成"STL容器"去理解.

? ? ? ? 1>本書P695第三段."它是一個概念化的抽象基類,是因為容器類并不真正使用繼承機制,換句話說,容器概念指定了所有STL容器類都必須滿足的一系列要求"

? ? ? ? ----是抽象基類,但不真正使用繼承機制,讀起來還是很拗口.既然他不要求繼承,就不要想繼承吧,問題不大.容器概念指定了所有STL容器類都必須滿足的一系列要求.估計所有STL容器類都定義了Iterator迭代器作為內部類,算一種表現.C++基礎語法:STL之迭代器-CSDN博客

? ? ? ? ?2>第四段:容器是存儲其他對象的對象。被存儲的對象必須是同一種類型的,它們可以是OOP意義上的對象,也可以是內置類型值。存儲在容器中的 數據為容器所有,這意味著當容器過期時,存儲在容器中的數據也將過期(然而,如果數據是指針的話,則它指向的數據并不一定過期)

?????????----容器的概念:存儲其他對象的對象.被存儲對象必須是同一類型,是OOP對象,內置類型,指針類型都可以.

? ? ? ? 3>第五段:不能將任何類型的對象存儲在容器中,具體地說,類型必須是可復制構造的和可賦值的。基本類型滿足這些要求;只要類定義沒有將復制構造函數和賦值運算符聲明為私有或保護的,則也滿足這種要求。 C++11改進了這些概念,添加了術語可復制插入(CopyInsertable)和可移動插入(MoveInsertable),但這里只進行簡單的概述

? ? ? ? ----class類型(類類型),有默認復制構造函數和賦值構造函數,也沒有放在私有或保護空間(否則在類作用域外無法調用,如在main函數里不能使用 SomeType a=b;),所以沒有問題.

????????在表16.5 "一些基本容器特征"中,提供了"所有容器都提供某些特征和操作".這里有個問題:所有容器是指STL容器,不包括自定義容器(按上面標題1>所述,應該指STL容器).vector<vector<int> >是允許的,如果自定義一個容器叫element,那么vector<element<int> >是否能用?留待驗證.

? ? ? ? 4>第六段:所有容器都提供的某些特征和操作.

? ? ? ? ?----a和b表示類型為X的值;u表示類型為X的標識符.實際上都表示容器類對象,a和b為已初始化的對象,而u表示尚未初始化的對象.

? ? ? ? 時間復雜度:編譯時間快于固定,固定快于線性時間.理解:線性時間需要訪問容器里每一個元素

? ? ? ? 本書P696中"C++新增的基本容器要求"?用到非常量右值,暫不說明

==============================內容分割線==================================?

????????注意:區分STL容器和自定義容器.自定義容器是自己拿類模板定義的,?除了自身定義的api,不能調用表格16.5內的api.嚴格的說:容器是指STL按照類模板定義的數據集合類."自定義容器"是自定義的類模板,存放某一種數據類型的數據集合的類.

? ? ? ? "容器"是一種概念,并且被STL模板庫所實現,要想使用容器,就必須遵守他的規定.例如:類型必須是可復制構造的和可賦值的.---是對于容器的說明,在上面標題3>

????????.假設建立一個vector<vector<int> >.如果自己也定義一個容器elem,不給他定義elem(const elem&)//復制構造函數和elem operator=(const elem&)//賦值構造函數,那么vector<elem<int> >這個容器建立不起來,或者調用表格api會出問題.? 而本書P613的queuetp.h中的QueueTP可以做.建立一個vector<QueueTP<int> >.筆者目前沒有試過,這段話屬于假設.

? ? ? ? 能不能讓自定義容器調用16.5里的api呢,因為容器沒有繼承機制,如果能進入容器底層(編譯器?)或許可以,但這已經超出本書學習范圍了.如果所用的容器算法不太夠用,可以針對容器類對象,用C++間接開發.

class SecondDevelopment{vector<string> strings; //vector對象傳入類SecondDevelopment  
public:etc;                //其他,用對象函數處理strings
}

==============================內容分割線==================================??

?序列

? ? ? ? 本書內容解讀?

? ? ? ? STL容器進行了分類,其中序列是其中一個種類,特點是序列元素有確定的順序.

? ? ? ? 1>本書P697第二段:序列還要求其元素按嚴格的線性順序排列,即存在第一個元素、最后一個元素,除第一個元素和最后一個元素外,每個元素前后都分別有 一個元素。數組和鏈表都是序列,但分支結構(其中每個節點都指向兩個子節點)不是

? ? ? ? ?----數組和鏈表比較熟悉了, 分支結構指的是結點有兩個以上子結點的,比如數據結構中的"二叉樹",他有左結點和右結點,在每個結點后面可以往兩個方向走.? ? ? ?

? ? ? ? 2>表16.7的說明? ? ? ??

? ? ? ? 序列類容器的通用函數,整體來說,內容包括:生成序列容器類對象,插入,刪除

a.clear()   //清空序列容器

????????另外表達式中有用迭代器對象做形參的地方,按照容器的通用方法,只有begin()和end()是明確能返回首元素迭代器和超尾迭代器.其他地方的迭代器需要求出來.方法和指針一樣,例如:

/*偽代碼*/
//有序列容器sequence,容器內元素類型T,序列容器對象object;
sequence<T> object;  sequence::iterator findIterator(T val){         //查找T類型值所在迭代器   
sequence<T>::iterator ptr;                      //聲明迭代器對象;不寫可以讓編譯器推斷;
for(ptr=object.begin();ptr!=object.end();ptr++){if(*ptr=val)return ptr;}
}   

? ? ? ? 本書P697第一段:序列概念增加了迭代器 至少是正向迭代器這樣的要求,這保證了元素將按特定順序排列,不會在兩次迭代之間發生變化.----序列用至少正向迭代器,所以支持"ptr++"和"*Ptr"

? ? ? ? 這段代碼的場景是求出某個值所在迭代器,讓后傳入insert函數或者erase函數中使用

? ? ? ? 3>表16.8說明

????????序列類容器的專用函數,整體來說,內容包括:插入,刪除,查找

? ? ? ? 注意:可選的序列函數是哪些容器能使用.

????????用a[n]查找容器內元素的兩個容器vector和deque,說明用的是隨機訪問迭代器

????????常用的push_back()函數,插入序列容器末尾.

小結

? ? ? ? 區別STL容器和自定義容器.

? ? ? ? 可以從迭代器的"糾結"中解放出來了.STL容器將迭代器使用大大簡化了.迭代器也是為了函數而產生的,api在那里,程序員直接調用,不用管迭代器到底干了什么.?

????????迭代器既是實現也是一種概念,從使用者的角度來說,他增加了"統一性"的同時也增加了類模板的復雜程度.但最值得肯定的一點,程序員從中得到啟發.嘗試自己概念設計和實現.

? ? ? ? STL容器簡化了編程,降低了靈活度并制定了使用規則.自定義容器靈活度高,但從頭做起難度會高一些.使用首選STL容器,有對容器感興趣的,可以自己嘗試容器設計,參考黑皮書<C++編程思想>

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

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

相關文章

NineData全面支持PostgreSQL可視化表結構設計

“PostgreSQL 是最像 Oracle 的開源關系型數據庫“&#xff0c;也正因為如此&#xff0c;很多企業都青睞 PostgreSQL&#xff0c;拿它當成 Oracle 的替代品。所以毫無疑問&#xff0c;目前 PostgreSQL 在企業中非常常見。 對于直接接觸 PostgreSQL 的開發人員而言&#xff0c;…

echarts多柱堆疊的X軸順序

在一些圖表場景中&#xff0c;需要顯示多柱堆疊的數據&#xff0c;那么X軸上每一段單位區域內會有多根柱子&#xff0c;每一根柱子標識不同的數量項含義&#xff0c;那么怎樣控制這幾根柱的左右順序呢&#xff1f; 其實這跟echarts的option里的series由關&#xff0c;開始我以為…

快速排序及歸并排序的實現與排序的穩定性

目錄 快速排序 一. 快速排序遞歸的實現方法 1. 左右指針法 步驟思路 為什么要讓end先走&#xff1f; 2. 挖坑法 步驟思路 3. 前后指針法 步驟思路 二. 快速排序的時間和空間復雜度 1. 時間復雜度 2. 空間復雜度 三. 快速排序的優化方法 1. 三數取中優化 2. 小區…

實驗豐富、原創改進!|多策略改進蜣螂優化算法(MATLAB)

本文內容來源于本人公眾號&#xff1a;KAU的云實驗臺&#xff0c;更新內容&#xff1a;智能優化算法及其改進應用。 本文核心內容&#xff1a; 新穎的多策略改進蜣螂優化算法 對比算法包括&#xff1a;高引用/新發布/經典/其他DBO變體&#xff08;共11種&#xff09; 實驗設計…

用c語言寫一個貪吃蛇游戲

貪吃蛇游戲通常涉及到終端圖形編程和簡單的游戲邏輯。以下是一個基本的實現示例&#xff0c;包括貪吃蛇的移動、食物生成、碰撞檢測等功能。 1. 貪吃蛇游戲的基本結構 貪吃蛇游戲可以分為以下幾個部分&#xff1a; 游戲地圖和終端繪制&#xff1a;使用二維數組表示游戲地圖&am…

SpringBoot結合ip2region實現博客評論顯示IP屬地

你好呀&#xff0c;我是小鄒。 在現代的Web應用中&#xff0c;特別是博客和論壇類網站&#xff0c;為用戶提供地理定位服務&#xff08;如顯示用戶所在地理位置&#xff09;可以極大地增強用戶體驗。本文將詳細探討如何使用Java和相關技術棧來實現在博客評論中顯示用戶的地址信…

Java實驗3

實驗內容 學生信息管理系統 學生成績表Student(Sno 字符串&#xff0c;長度9, Sname 字符串&#xff0c;長度10, Class 字符串&#xff0c;長度10, Age 整型, Sex 字符串&#xff0c;長度2) 實現如下功能&#xff1a; A&#xff0e;輸入若干個學生的信息到Student表&#x…

初學Python必須知道的14個強大單行代碼

引言&#xff1a;Python的魅力與單行代碼的重要性 Python以其簡潔明了的語法、豐富的內置函數和強大的第三方庫深受廣大開發者喜愛。尤其對于編程小白來說&#xff0c;學習Python就像打開了一扇通向編程世界的大門。而單行代碼&#xff0c;作為Python魅力的一部分&#xff0c;…

【NetTopologySuite類庫】合并所有幾何的包圍盒AABB

流程示意圖 示例代碼 using GeoAPI.Geometries; using Microsoft.VisualStudio.TestTools.UnitTesting; using NetTopologySuite.Geometries; using NetTopologySuite.IO; using System.Collections.Generic; using System.Linq;namespace Test472 {[TestClass]public class T…

深度解析:電商訂單API及其技術實現

隨著電子商務的發展&#xff0c;實體企業開拓電商渠道的越來越多&#xff0c;原有的管理系統都需要增加電商業務管理功能&#xff0c;其中&#xff0c;對電商訂單的管理是每一個電商商家都需要的功能&#xff0c;所以對于開發者來說&#xff0c;了解電商API是什么是非常重要的&…

第100+16步 ChatGPT學習:R實現Xgboost分類

基于R 4.2.2版本演示 一、寫在前面 有不少大佬問做機器學習分類能不能用R語言&#xff0c;不想學Python咯。 答曰&#xff1a;可&#xff01;用GPT或者Kimi轉一下就得了唄。 加上最近也沒啥內容寫了&#xff0c;就幫各位搬運一下吧。 二、R代碼實現Xgboost分類 &#xff08…

LeetCode題練習與總結:比較版本號--165

一、題目描述 給你兩個 版本號字符串 version1 和 version2 &#xff0c;請你比較它們。版本號由被點 . 分開的修訂號組成。修訂號的值 是它 轉換為整數 并忽略前導零。 比較版本號時&#xff0c;請按 從左到右的順序 依次比較它們的修訂號。如果其中一個版本字符串的修訂號較…

C++動態內存的管理

今天來分享C動態內存管理相關知識&#xff0c;閑言勿談&#xff0c;直接上干貨。 1. 動態內存的開辟和銷毀(new和delete) (1)前置知識&#xff1a;我們知道c語言有malloc和calloc和realloc三個函數可以進行動態的開辟內存&#xff0c;那么它們有什么區別呢&#xff1f;首先是…

MPS 后端

本文來自&#xff1a; https://pytorch.org/docs/stable/notes/mps.html https://pytorch.ac.cn/docs/stable/notes/mps.html MPS 后端 mps 設備支持 在使用 Metal 編程框架的 MacOS 設備上&#xff0c;進行高性能 GPU 訓練。 它引入了新的設備&#xff0c;將機器學習計算圖和…

【C語言】條件運算符詳解 - 《 A ? B : C 》

目錄 C語言條件運算符詳解1. 條件運算符的語法和使用示例 1&#xff1a;基本用法輸出 2. 嵌套條件運算符示例 2&#xff1a;嵌套條件運算符輸出 3. 條件運算符與 if-else 語句的比較示例 3&#xff1a;使用 if-else 語句示例 4&#xff1a;使用條件運算符 4. 條件運算符的實際應…

PLC_博圖系列?基本指令”TONR:時間累加器“

PLC_博圖系列?基本指令”TONR&#xff1a;時間累加器“ 文章目錄 PLC_博圖系列?基本指令”TONR&#xff1a;時間累加器“背景介紹TONR&#xff1a; 時間累加器說明參數脈沖時序圖示例 關鍵字&#xff1a; PLC、 西門子、 博圖、 Siemens 、 TONR 背景介紹 這是一篇關于P…

ElasticSearch學習之路

前言 為什么學ElasticSearch&#xff1f; 數據一般有如下三種類型&#xff1a; 結構化數據&#xff0c;如&#xff1a;MySQL的表&#xff0c;一般通過索引提高查詢效率非結構化數據&#xff0c;如&#xff1a;圖片、音頻等不能用表結構表示的數據&#xff0c;一般保存到mong…

Linux C++ 054-設計模式之外觀模式

Linux C 054-設計模式之外觀模式 本節關鍵字&#xff1a;Linux、C、設計模式、外觀模式 相關庫函數&#xff1a; 概念 外觀模式&#xff08;Facade&#xff09;&#xff0c;亦稱“過程模式”。主張按照描述和判斷資料來評價課程&#xff0c;關鍵的活動是在課程實施的全過程中…

昇思25天學習打卡營第24天|基于MindSpore的Diffusion擴散模型

Diffusion擴散模型 本文基于Hugging Face&#xff1a;The Annotated Diffusion Model一文翻譯遷移而來&#xff0c;同時參考了由淺入深了解Diffusion Model一文。 關于擴散模型&#xff08;Diffusion Models&#xff09;有很多種理解&#xff0c;本文的介紹是基于denoising di…

基礎動態規劃題目基礎動態規劃題目

目錄 題目1&#xff1a; P1216 [USACO1.5] [IOI1994]數字三角形 Number Triangles 代碼示例&#xff1a; 題目2&#xff1a; Common Subsequence 代碼示例 題目3 &#xff1a;最長上升子序列 最長不下降子序列 最長上升子序列oj答案 題目1&#xff1a; P1216 [USACO1.5]…