C++學習~~string類

1.STL簡單介紹

(1)標準模版庫,是C++里面的標準庫的一部分,C++標準庫里面還有其他的東西,但是我們不經常使用,我們經常使用的還是STL這個標準庫部分。

(2)六大件:仿函數,算法,迭代器,空間配置器,容器,配接器;

2.string標準庫

(1)string這個里面包含100多個函數,這個總體的設計還是比較復雜的;

(2)下面淺淺的使用string感受一下這個基本的使用和他的便捷性;

string里面有不傳參的構造函數和傳參的構造函數,我們可以簡單的定義試用一下:

s1就是我們定義的不傳參的對象,s2就是傳參的對象;

(3)string里面已經重載+這個運算符,所以我們可以實現不同對象的相加,以及我們創建的對象和字符串的相加;

這些都是可以實現的,相比于C語言里面的strcat函數,雖然也是可以實現這個功能的,但是使用起來沒有C++里面的string這個方便,因為C語言里面實現這個字符串的相加需要找到斜杠0,再去追加,而且要考慮會不會溢出的問題,因為我們追加的字符串可能超過原本的字符串的大小,這些都是我們需要考慮的問題?,但是使用string就不需要考慮這些問題,因為系統會自動擴容;

(4)帶參數的構造的兩種形式

這兩種方式最后可以達到的效果是一樣的,第二種本質上就是構造加拷貝構造加優化,因為單參數的支持類型的轉換;

3.使用string進行遍歷的三種方式

(1)就是我們最熟悉的使用循環進行遍歷:這個過程是可讀可寫的,第一種就是便利這個字符串里面的每個字符,size這個函數就是string里面已經實現的函數,我們是可以直接進行使用的,這個函數的作用就是求這個字符串的長度;

我們在這個循環里面還是用了[ ]這樣的成員訪問運算符,這個實際上string作為類肯定是不能直接進行訪問的(因為這個我們之前已經在運算符重載的時候介紹過),這些運算符是針對的內置類型,類這樣的自定義類型也是不能直接使用的,要想使用就必須進行運算符的重載,但是string的庫里面已經實現了,所以我們也是可以直接使用的

?(2)使用迭代器進行遍歷:

下面我們分別使用正向的迭代器和反向的迭代器進行這個字符串的結果的打印;

迭代器和指針很相似,我們想要實現這個字符串的遍歷,就要找到字符串的頭部位置,begin這個函數就可以找到這個字符串的頭部的位置,end這個函數就可以找到這個字符串的尾部的位置;

我們是使用string這個類創建對象,并且使用的是有參的初始化,string::iterator就是正向的迭代器的格式,這個里面定義的it相當于是一個形參這個名字是可以隨便寫的,但是前面的那個是不可以修改的(前面的是正向的迭代器的固定書寫格式),我們的it就相當于是一個指針,我們我們是使用循環,對這個it進行解引用之后打印的,每次打印之后都會讓這個it++,我們的循環條件寫的是it!=s1.end()就是只用it沒有指向這個字符串的最后一個字符,我們就不會停止打印;

這里的循環條件其實也是可以選擇it<s1.end()這個其實也是符合的,也是可以作為循環條件的,但是我們這里使用的是不等于,因為這個不等于更具有普適性,就是我們這里學習string可以使用,我們將來學習vector和list也是可以使用的,這個具有通用性,但是像那個小于號作為循環的條件的話,在其他的情況下面就會報錯,不具有普適性,所以我們推薦的是it!=s1.end()這樣的寫法;

上面的是正向的迭代器,下面我們可以看一下反向的迭代器和它的作用,使用的方法;

有下面的幾點需要我們注意:

(1)反向迭代器前面的string_reverse_iterator也是固定的,這個我們是不能亂寫的,但是后面的it我們是可以進行其他名字的定義;

(2)我們在正向迭代器里面使用的函數就是begin()函數和end()函數,在這個反向的迭代器里面,我們使用的函數和正向迭代器的函數的作用是一樣的,但是在函數的名字上面進行了修飾,就是為了進行區分,在這個函數的名字前面加上了r(就是reverse的首個字母);

(3)我們這里的s3.rbegin()這個函數的調用之后,拿到的是這個字符串的最后一個字符,所以我們稱之為反向迭代器,it++是向前加加,所以我們在使用反向迭代器的時候是從后向前看的,這個時候打印出來的結果就是按照從后向前的順序進行打印的;

(4)這個里面,我們就可以重新認識一下auto這個關鍵字的功能了,這里我們寫的string::reverse_iterator這個類型的名字就會比較長,比較繁瑣,我們就可以使用這個auto關鍵字進行替代,auto這個關鍵字的作用就是對于這個函數的返回值類型進行自動的識別,這里的rbegin函數的返回值就是string::reverse_iterator類型的(詳情請閱讀下面的文檔),我們替換之后啊這個編譯器就會自動的匹配類型,這樣是同樣可以是像我們想要的效果的;

(3)使用范圍for進行打印結果

從語法上面來講,這個范圍for是很強的,因為我們不需要進行其他的額外操作,這個范圍for使用的時候編譯器會自動的進行加加操作,自動的判斷結束,使用的格式就是上面的展示那樣;

但是這個范圍for這個語法本質上面和迭代器是沒有本質的區別的,范圍for和迭代器在底層上面是很類似的,其實也并不是什么高大上的東西;

(4)const修飾的迭代器

這個時候編譯器就會報錯,就是因為這個const導致的權限的問題,我們是需要進行下面的修改的

就是我們這里是使用帶const的形參進行調用這個begin函數的,形參s是const類型的,我們的返回值就應該進行一定的程度的修改;

實際上,我們的這個begin函數是有兩種返回值的類型的,一種是帶const的,另外的一種是不帶const的,我們只需要注意在適應的時候相互對應就可以了;

這里是列舉了正向迭代器帶const的版本,反向的一樣的,const添加的位置就是下面的圖片展示的那樣,注意這個const添加的位置(不要加在最前面);?

?

(5)總結:通過這個對于字符串進行遍歷,我們引入了迭代器這個概念,這個迭代器在嚴格的意義上面是有4種的,帶const的正向迭代器,不帶const的正向迭代器,帶const的反向迭代器,不帶const的反向迭代器,并對部分進行了展示;

雖然迭代器看似很好,但是我們不會經常使用,因為這個string 里面重載了[? ]運算符的,我們是可以直接使用這個運算符進行訪問的,但是我們學習這個迭代器是因為這個迭代器在vertor以及list里面均有涉及到,我們要大致的認識了解。

4.一些其他的函數說明

(1)拷貝和選擇性拷貝

?這里的s2就是s1的直接全部拷貝,s3就是從s1的下標為5的字符位置處開始拷貝,拷貝的數量就是2個字符(這個函數里面的每個參數的實際含義我們也是應該了解的);

我們這個里面的三個參數第一個就是我們想要拷貝的對象,第二個就是我們想要拷貝的字符的起始位置,第三個就是我們想要拷貝的終止位置;

如果我們想要拷貝到最后一個數據,難道我們要一個一個數嗎?肯定是不需要的,我們可以有兩種解決方案,一種就是直接不寫第三個參數,因為就算我們不寫,其實這個也是有默認的缺省參數的,我們不寫的話,這個第三個參數就會直接默認是最后的一個字符;

我們是有方法去求解這個后面字符的個數的,我們可以調用這個size函數求解全部的字符的個數再去減去第二個參數,這樣的話也是可以求得這個后面的字符的個數的;

(2)初始化的相關函數

這里的話就是使用的10個a進行初始化,下面的那種是使用的一段區間進行初始化;

(3)求字符串的長度的函數

這兩個函數都可以求解字符串的長度,但是好像并沒有區別,為什么會出現兩個用途一樣的函數?因為string的出現時間比STL更早,本來使用的是length函數求解字符串的長度,后來STL出現之后,就添加了size函數,這個size函數更加通用,使用更加廣泛;

5.string的一個簡單的應用?

(1)下面我們使用string的相關語法和函數進行求解:

?

(2)因為這個里面出現的都是26個字母,所以我們就可以定義一個26個字符大小的一個數組,用來存儲數據,接下來使用迭代器進行遍歷,統計次數,ch為什么要減去‘a’,這個地方實際上就是ASCII值的相關計算,假設我們的a字符,ASCII是97,我們這個時候拿97作為這個數組的下標肯定是會越界的,我們需要找到一個相對的下標,就是使用這個ch-a相當于是減去97作為這個數組的下標;

(3)上面的這個迭代器完成之后,我們就已經統計出來了26個字母,每個字母在這個字符串里面出現的次數,接下來我們就要查看哪個字符出現一次,而且我們要找的是第一個只出現一次的字符,找到之后就返回這個下標,否則就返回-1。?

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

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

相關文章

C# WinForm —— 16 MonthCalendar 介紹

1. 簡介 可以選擇單個日期&#xff0c;也可以選擇一段日期&#xff0c;在選擇時間范圍上 比較適用&#xff0c;但不能跨月份選擇日期范圍 在直觀上&#xff0c;可以快速查看、選擇日期/日期范圍 2. 常用屬性 屬性解釋(Name)控件ID&#xff0c;在代碼里引用的時候會用到,一般…

Uni-app基礎知識

uni-app組成和跨端原理 | uni-app官網uni-app,uniCloud,serverless,uni-app組成和跨端原理,基本語言和開發規范,編譯器,運行時&#xff08;runtime&#xff09;,邏輯層和渲染層分離https://uniapp.dcloud.net.cn/tutorial/1.adb連接模擬器 找到adb所在位置&#xff08;一般在hb…

C++ 程序員常用的VScode的插件

vscode中好用的插件 Better CommentsBookmarksC/C ThemeChinese (Simplified) (簡體中文) Language Pack for Visual Studio CodeclangdClang-FormatCodeLLDBCMakeCMake ToolsCode RunnerCode Spell CheckerCodeSnapColor Highlightvscode-mindmapDraw.io IntegrationError Len…

一網打進Linux下那些查找命令

查找是我們每天都在做的事情&#xff0c;早上醒來找下手機&#xff0c;出門之前查下公交&#xff0c;坐下之后查下資料&#xff0c;分析數據查下模式。 查找文件&#xff0c;查找信息&#xff0c;查找錯誤是應用起來更為具體的一些工作&#xff0c;而Linux命令行為我們提供了很…

對稱加密算法的應用場景

隨著信息技術的飛速發展&#xff0c;數據安全成為了至關重要的議題。在保護數據傳輸和存儲的過程中&#xff0c;加密算法扮演著不可或缺的角色。其中&#xff0c;對稱加密算法&#xff0c;由于其高效性和易用性&#xff0c;被廣泛應用于各種場景中。本文將探討對稱加密算法的主…

Kubernets多master集群構建負載均衡

前言 在構建 Kubernetes 多 Master 集群時&#xff0c;實現負載均衡是至關重要的一環。通過多臺 Master 節點配合使用 Nginx 和 Keepalived 等工具&#xff0c;可以有效提高集群的可靠性和穩定性&#xff0c;確保系統能夠高效運行并有效應對故障。接下來將介紹如何配置這些組件…

Kotlin 編譯器和工具鏈:深入解析與實踐案例

Kotlin 編譯器和工具鏈是構建 Kotlin 項目的核心組件&#xff0c;它們負責將 Kotlin 代碼轉換為可在 JVM 或 JavaScript 環境中運行的代碼。本文將詳細介紹 Kotlin 編譯器和工具鏈的工作原理、使用方法&#xff0c;以及在實際開發中的應用案例。 1. 引言 Kotlin 作為一種現代…

JAVA GUI 植物大戰僵尸

公眾號&#xff1a;編程驛站 沒有做太多封裝。難免有冗余。源碼全部放出&#xff0c;有興趣者可以再改之。 1. pea 類 package com.hm;import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOExce…

物業水電抄表系統的全面解析

1.系統概述 物業水電抄表系統是現代物業管理中的重要組成部分&#xff0c;它通過自動化的方式&#xff0c;實時監控和記錄居民或企業的水電使用情況&#xff0c;極大地提高了工作效率&#xff0c;降低了人工抄表的錯誤率。該系統通常包括數據采集、數據傳輸、數據分析和數據展…

鏈表OJ題(移除鏈表元素,反轉鏈表,分割鏈表,環形鏈表(是否成環問題),鏈表中間節點(快慢指針講解),環形鏈表(找入環節點))“題目來源力扣附帶題目鏈接”

目錄 1.移除鏈表元素 2.反轉鏈表 2.1三指針法 2.2頭插法 3.分割鏈表 4.鏈表的中間節點&#xff08;快慢指針&#xff09; 4.1快慢指針 4.2求鏈表的中間節點 5.環形鏈表 5.1環形鏈表是否成環 5.2環形鏈表入環節點 5.3入環節點推論的不完備性說明 1.移除鏈表元素 移除…

Microsoft Threat Modeling Tool 使用(三)

Boundary&#xff08;邊界&#xff09; 本文介紹信任邊界&#xff0c;基于 SDL TM Knowledge Base (Core) 模版&#xff0c;這是一個通用的威脅建模模板&#xff0c;非常適合初學者和大多數威脅建模需求。 這些邊界&#xff08;Boundary&#xff09;在微軟威脅建模工具中用于表…

Java多線程與高并發

1、什么是進程?什么是線程? 進程:進程是程序的基本執行實體;另外一種解釋是進程是一個應用程序(1個進程是一個軟件)。 線程:線程是操作系統能夠進行運算調度的最下單位。它被包含在進程之中,是進程中的實際運作單位;是一個進程中的執行場景/執行單元。 注意:。一個進…

uniapp實現列表拖拽排序+滑動刪除功能

此篇代碼在原插件基礎進行了bug修改與滑動功能的新增 原插件地址 HM-dragSorts.vue組件使用 HM-dragSorts.vue <template><view class""><view class"HM-drag-sort" :style"{height: ListHeightrpx,background-color: listBackground…

魔法方法介紹

【一】什么是魔法方法 在類內部達到指定條件會自動觸發的方法 【二】魔法方法 # 【1】__init__ &#xff1a; 實例化類得到對象的時候會自動觸發 class Student(object):def __init__(self):print(f"實例化類的時候觸發") # 實例化類的時候觸發 ? s Student…

在云服務器上運行StyleGAN3生成偽樣本

首先是傳入數據&#xff0c;這里我們不做贅述。 對于數據格式的裁剪&#xff0c;可以通過以下代碼進行&#xff1a; from glob import glob from PIL import Image import os from tqdm import tqdm from tqdm.std import trangeimg_path glob(r"C:\Users\Administrato…

【Oracle篇】rman物理備份工具的基礎理論概述(第一篇,總共八篇)

??博主介紹??&#xff1a; ?又是一天沒白過&#xff0c;我是奈斯&#xff0c;DBA一名? ???擅長Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式數據倉庫)、Linux&#xff0c;也在擴展大數據方向的知識面??? ??????大佬們都喜歡靜靜的看文章&am…

嵌入式是大坑的說法,是否與學生的信息不對稱有關?

在開始前我有一些資料&#xff0c;是我根據網友給的問題精心整理了一份「嵌入式的資料從專業入門到高級教程」&#xff0c; 點個關注在評論區回復“888”之后私信回復“888”&#xff0c;全部無償共享給大家&#xff01;&#xff01;&#xff01; 目前也算是在搞嵌入式&#…

【深度學習】時空圖卷積網絡(STGCN),預測交通流量

論文地址&#xff1a;https://arxiv.org/abs/1709.04875 Spatio-Temporal Graph Convolutional Networks: A Deep Learning Framework for Traffic Forecasting 文章目錄 一、摘要二、數據集介紹美國洛杉磯交通數據集 METR-LA 介紹美國加利福尼亞交通數據集 PEMS-BAY 介紹美國…

Cocktail for Mac 激活版:一站式系統優化與管理神器

Cocktail for Mac是一款專為Mac用戶打造的系統優化與管理工具&#xff0c;憑借其強大的功能和簡便的操作&#xff0c;贏得了廣大用戶的喜愛。這款軟件集系統清理、修復和優化于一身&#xff0c;能夠幫助用戶輕松解決Mac系統中的各種問題&#xff0c;提高系統性能。 Cocktail fo…

Leetcode-有效的括號(帶圖)

20. 有效的括號 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/valid-parentheses/ 題目 給定一個只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判斷字符串是否有效。 有效字符串需滿足&…