7.STL_string(詳細)

?1. 什么是STL

STL(standard template libaray-標準模板庫):是C++標準庫的重要組成部分,不僅是一個可復用的組件庫,而且 是一個包羅數據結構與算法的軟件框架

2. STL的版本

原始版本

Alexander Stepanov、Meng Lee 在惠普實驗室完成的原始版本,本著開源精神,他們聲明允許任何人任意 運用、拷貝、修改、傳播、商業使用這些代碼,無需付費。唯一的條件就是也需要向原始版本一樣做開源使 用。 HP 版本--所有STL實現版本的始祖

P. J. 版本

由P. J. Plauger開發,繼承自HP版本,被Windows Visual C++采用,不能公開或修改,缺陷:可讀性比較低, 符號命名比較怪異。

RW版本

由Rouge Wage公司開發,繼承自HP版本,被C+ + Builder 采用,不能公開或修改,可讀性一般。

SGI版本

由Silicon Graphics Computer Systems,Inc公司開發,繼承自HP版 本。被GCC(Linux)采用,可移植性好, 可公開、修改甚至販賣,從命名風格和編程 風格上看,閱讀性非常高。我們后面學習STL要閱讀部分源代碼, 主要參考的就是這個版本。

3. STL的六大組件

今天我們主要要講到string和reverse(逆置)

1. 為什么學習string類?

1.1 C語言中的字符串

C語言中,字符串是以'\0'結尾的一些字符的集合,為了操作方便,C標準庫中提供了一些str系列的庫函數, 但是這些庫函數與字符串是分離開的,不太符合OOP的思想,而且底層空間需要用戶自己管理,稍不留神可 能還會越界訪問。

2. 標準庫中的string類

2.1 string類(了解)

string類的文檔介紹

  1. 字符串是表示字符序列的類
  2. 標準的字符串類提供了對此類對象的支持,其接口類似于標準字符容器的接口,但添加了專門用于操作 單字節字符字符串的設計特性。
  3. ?string類是使用char(即作為它的字符類型,使用它的默認char_traits和分配器類型(關于模板的更多信 息,請參閱basic_string)。
  4. string類是basic_string模板類的一個實例,它使用char來實例化basic_string模板類,并用char_traits 和allocator作為basic_string的默認參數(根于更多的模板信息請參考basic_string)。
  5. 注意,這個類獨立于所使用的編碼來處理字節:如果用來處理多字節或變長字符(如UTF-8)的序列,這個 類的所有成員(如長度或大小)以及它的迭代器,將仍然按照字節(而不是實際編碼的字符)來操作。

總結:

  1. string是表示字符串的字符串類
  2. ?該類的接口與常規容器的接口基本相同,再添加了一些專門用來操作string的常規操作。
  3. ?string在底層實際是:basic_string模板類的別名,typedef basic_string string;
  4. 不能操作多字節或者變長字符的序列。

在使用string類時,必須包含#include頭文件以及using namespace std;

2.2 string類的常用接口說明

(注意下面只講解最常用的接口)

1. string類對象的常見構造

看一下string的一些實現

上面使用到了 傳地址(開辟新空間接收)和?直接傳字符串(會發現,其實是傳的引用):

2. string類對象的容量操作

可以測試發現:

注意:clear清理的是size,capacity不變

reserve

通過查閱可以了解其性能?

【注意】

  1. ?size()與length()方法底層實現原理完全相同,引入size()的原因是為了與其他容器的接口保持一 致,一般情況下基本都是用size()。
  2. ?clear()只是將string中有效字符清空,不改變底層空間大小
  3. ?resize(size_t n) 與 resize(size_t n, char c)都是將字符串中有效字符個數改變到n個,不同的是當字 符個數增多時:resize(n)用0來填充多出的元素空間,resize(size_t n, char c)用字符c來填充多出的 元素空間。注意:resize在改變元素個數時,如果是將元素個數增多,可能會改變底層容量的大小,如果是將元素個數減少,底層空間總大小不變。
  4. reserve(size_t res_arg=0):為string預留空間,不改變有效元素個數,當reserve的參數小于 string的底層空間總大小時,reserver不會改變容量大小。

?3. string類對象的訪問及遍歷操作

那么我們現在遍歷字符串就有三種方法了:

?1. for+operator[]
for (size_t i = 0; i < s.size(); ++i)cout << s[i] << endl;
2.迭代器 iterator?
string::iterator it = s.begin();
while (it != s.end())
{cout << *it << endl;//迭代器回自動++++it;
}// string::reverse_iterator rit = s.rbegin();
// C++11之后,直接使用auto定義迭代器,讓編譯器推到迭代器的類型
auto rit = s.rbegin();
while (rit != s.rend())cout << *rit << endl;
3.范圍for

for (auto ch : s)
?? ?cout << ch << endl;

4. string類對象的修改操作

一些實現和應用

void Teststring5()
{string str;str.push_back(' ');   // 在str后插入空格str.append("hello");  // 在str后追加一個字符"hello"str += 'b';           // 在str后追加一個字符'b'   str += "it";          // 在str后追加一個字符串"it"cout << str << endl;cout << str.c_str() << endl;   // 以C語言的方式打印字符串// 獲取file的后綴string file("string.cpp");size_t pos = file.rfind('.');string suffix(file.substr(pos, file.size() - pos));cout << suffix << endl;// npos是string里面的一個靜態成員變量// static const size_t npos = -1;// 取出url中的域名string url("http://www.cplusplus.com/reference/string/string/find/");cout << url << endl;size_t start = url.find("://");if (start == string::npos){cout << "invalid url" << endl;return;}start += 3;size_t finish = url.find('/', start);string address = url.substr(start, finish - start);cout << address << endl;// 刪除url的協議前綴pos = url.find("://");url.erase(0, pos + 3);cout << url << endl;
}

【注意】:

1. 在string尾部追加字符時,s.push_back(c) / s.append(1, c) / s += 'c'三種的實現方式差不多,一般 情況下string類的+=操作用的比較多,+=操作不僅可以連接單個字符,還可以連接字符串。

2. 對string操作時,如果能夠大概預估到放多少字符,可以先通過reserve把空間預留好

5. string類非成員函數

上面的幾個接口大家可以了解一下,下面的OJ題目中會有一些體現他們的使用。string類中還有一些其他的 操作,這里不一一列舉,大家在需要用到時不明白了查文檔即可~

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

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

相關文章

maven遠程倉庫訪問順序

首先需要了解一下各個配置文件&#xff0c;主要分為三類&#xff1a; 全局配置文件(${maven.home}/conf/settings.xml)&#xff0c;maven安裝路徑下的/conf/settings.xml用戶配置文件(%USER_HOME%/.m2/settings.xml)&#xff0c;windows用戶文件夾下項目配置文件&#xff1a;p…

C/C++ 入門(10)list類(STL)

個人主頁&#xff1a;仍有未知等待探索-CSDN博客 專題分欄&#xff1a;C 歡迎來指教&#xff01; 目錄 一、標準庫中的list 1、了解 2、常用接口說明 a.常見的構造函數 b.迭代器 c. Capacity?編輯 d.Element access e.Modifiers 二、實現 1、框架 a.節點 b.迭代器 …

簡單易懂的Java Queue入門教程!

哈嘍&#xff0c;各位小伙伴們&#xff0c;你們好呀&#xff0c;我是喵手。運營社區&#xff1a;C站/掘金/騰訊云&#xff1b;歡迎大家常來逛逛 今天我要給大家分享一些自己日常學習到的一些知識點&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相學習&#xff0c;一…

如何建設智慧黨校

隨著信息技術的飛速展開&#xff0c;特別是近年移動互聯網技術&#xff0c;物聯網技術&#xff0c;人工智能技術&#xff0c;大數據數據的深入展開&#xff0c;我國快速的進入信息化社會&#xff0c;信息化對各行各業的改造越來越深入&#xff0c;任何職業&#xff0c;任何安排…

SSM【Spring SpringMVC Mybatis】—— Spring(一)

目錄 1、初識Spring 1.1 Spring簡介 1.2 搭建Spring框架步驟 1.3 Spring特性 1.5 bean標簽詳解 2、SpringIOC底層實現 2.1 BeanFactory與ApplicationContexet 2.2 圖解IOC類的結構 3、Spring依賴注入數值問題【重點】 3.1 字面量數值 3.2 CDATA區 3.3 外部已聲明be…

淺談ArrayList和LinkedList的區別

ArrayList和LinkedList在Java中都是常用的List接口的實現類&#xff0c;但它們之間存在一些顯著的區別。 實現方式&#xff1a; ArrayList&#xff1a;基于數組實現。內部使用一個動態數組來存儲元素&#xff0c;這意味著可以通過索引快速訪問元素&#xff0c;時間復雜度為O(1)…

算法學習筆記(Nim游戲)

N i m Nim Nim游戲 n n n堆物品&#xff0c;每堆有 a i a_i ai?個&#xff0c;每個玩家輪流取走任意一堆的任意個物品&#xff0c;但不能不取&#xff0c;取走最后一個物品的人獲勝。 N i m Nim Nim游戲是一種經典的公平組合游戲。現在對它進行分析。 首先定義兩個博弈中的狀…

【Chisel】chisel中怎么處理類似verilog的可變位寬和parameter

在 Chisel 中處理可變位寬和參數的方式與 Verilog 有一些不同&#xff0c;因為 Chisel 是建立在 Scala 語言之上的。以下是如何在 Chisel 中處理這些概念的方法&#xff1a; 參數化&#xff08;Parameters&#xff09; 在 Chisel 中&#xff0c;參數化是通過在模塊構造函數中定…

VUE使用餓了么的上傳組件時實現圖片預覽

創作靈感 最近在寫項目時&#xff0c;遇到了上傳頭像的需求&#xff0c;我使用的是element組件中的upload組件。但是在使用時&#xff0c;我需要實現預覽、手動上傳頭像等功能。然而在使用餓了么組件時&#xff0c;這些功能還是需要我們自己去手動實現的&#xff0c;在手動實現…

Linux makefile進度條

語法 在依賴方法前面加上就不會顯示這一行的命令 注意 1.make 會在當前目錄下找名為“makefile” 或者 “Makefile” 的文件 2.為了生成第一依賴文件&#xff0c;如果依賴文件列表有文件不存在&#xff0c;則會到下面的依賴關系中查找 3..PHONY修飾的依賴文件總是被執行的 …

Redis——RDB、AOF和混合持久化機制

Redis提供了三種持久化機制來確保數據的持久保存&#xff0c;分別是RDB&#xff08;Redis DataBase&#xff09;、AOF&#xff08;Append Only File&#xff09;和混合持久化。 RDB&#xff08;Redis DataBase&#xff09; RDB持久化機制是將Redis在內存中的數據保存到磁盤上的…

xss-lab 1-18關payload

Less-1 ?name<script>alert()</script> Less-2 "><script>alert()</script> "οnclick"alert() " οnfοcus"alert() " οnblur"alert() Less-3 οnfοcusalert() οnbluralert() οnfοcusjavascript:aler…

Spring AopUtils深度解析:從入門到精通的全方位指南

1. 概述 AopUtils是Spring框架中的一個工具類&#xff0c;主要用于處理AOP&#xff08;面向切面編程&#xff09;相關的操作。它提供了一系列靜態方法&#xff0c;幫助開發者更方便地處理AOP中的對象、代理以及通知&#xff08;Advice&#xff09;等。 2. 用途 AopUtils的主要…

操作系統原理與系統——實驗十三多道批處理作業調度(作業可移動)

關鍵代碼 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct data{int hour;//當前小時int min;//當前分鐘 }time; struct node{char name[20];//進程名time arrive;//到達就緒隊列時間int zx;//執行時間(預期時間)int size;int ta…

Polygon市值機器人

隨著區塊鏈技術的蓬勃發展和數字貨幣市場的日益繁榮&#xff0c;投資者們對于如何精準把握市場動態、實現資產穩健增長的需求愈發迫切。在這個背景下&#xff08;市值管理飛//機//aishutuyu&#xff09;&#xff0c;Polygon市值機器人應運而生&#xff0c;作為一款基于Polygon公…

LeetCode 第397場周賽個人題解

目錄 100296. 兩個字符串的排列差 原題鏈接 思路分析 AC代碼 100274. 從魔法師身上吸取的最大能量 原題鏈接 思路分析 AC代碼 100281. 矩陣中的最大得分 原題鏈接 思路分析 AC代碼 100312. 找出分數最低的排列 原題鏈接 思路分析 AC代碼 100296. 兩個字符串的排…

timerfd加epoll封裝定時器

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 1、用timerfd加epoll封裝定時器的優點2、代碼實現 1、用timerfd加epoll封裝定時器的優點 定時器為什么需要timerfd 在設計定時器時&#xff0c;我們首先想到的就是…

【SpringBoot】Redis Lua腳本實戰指南:簡單高效的構建分布式多命令原子操作、分布式鎖

文章目錄 一.Lua腳本1.Lua特性2.Lua優勢 二.Lua語法1.注釋2.變量3.數據類型&#xff1a;3.1.基本類型3.2.對象類型&#xff1a;表&#xff08;table&#xff09; 4.控制結構&#xff1a;4.1.條件語句: 使用if、else和elseif來實現條件分支。4.2.循環結構&#xff1a;Lua支持for…

Shell參數擴展形式學習筆記

Shell參數擴展形式學習筆記 文章目錄 Shell參數擴展形式學習筆記空值判斷處理 ${parameter:-word} ${parameter:word} ${parameter:?word} ${parameter:word}變量位置截取 ${parameter:offset} ${parameter:offset:length}變量匹配組合 ${!prefix*} ${!prefix} ${!name[]} ${!…

感知機和神經網絡

引入 什么是神經網絡&#xff1f; 我們今天學習的神經網絡&#xff0c;不是人或動物的神經網絡&#xff0c;但是又是模仿人和動物的神經網絡而定制的神經系統&#xff0c;特別是大腦和神經中樞&#xff0c;定制的系統是一種數學模型或計算機模型&#xff0c;神經網絡由大量的人…