【C++】STL學習之旅——初識STL,認識string類

在這里插入圖片描述

string類

  • 1 STL 簡介
  • 2 STL怎么學習
  • 3 STL缺陷
  • 4 string
    • 4.1 初識 string
    • 4.2 初步使用
      • 構造函數
      • 成員函數
  • 5 小試牛刀
  • Thanks?(・ω・)ノ謝謝閱讀!!!
  • 下一篇文章見!!!

1 STL 簡介

現在我正式開始學習STL,這讓我期待好久了,一想到不用手撕鏈表,手搓堆棧,心里非常爽。接下來我們先來介紹一下STL:

STL,英文全稱 standard template library,中文可譯為標準模板庫或者泛型庫,其包含有大量的模板類和模板函數,是 C++ 提供的一個基礎模板的集合,用于完成諸如輸入/輸出、數學計算等功能。 STL 最初由惠普實驗室開發,于 1998 年被定為國際標準,正式成為 C++ 程序庫的重要組成部分。

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

2 STL怎么學習

網上有句話說:“不懂STL,不要說你會C++”。STL是C++中的優秀作品,有了它的陪伴,許多底層的數據結構以及算法都不需要自己重新造輪子,站在前人的肩膀上,健步如飛的快速開發。那么我們應該如何學習呢?
首先就是關注官方網站 C++中查閱資料。我推薦使用這個:C++庫
然后 學好英語很重要,要學會閱讀文檔,無論學習什么新技術,英語絕對是必不可少的。(程序員的盡頭是英語
在這里插入圖片描述

3 STL缺陷

  1. STL庫的更新太慢了。這個得嚴重吐槽, 上一版靠譜是C++98,中間的C++03基本一些修訂。C++11出來已經相隔了13年,STL才進一步更新。
  2. STL現在都沒有支持線程安全。并發環境下需要我們自己加鎖。且鎖的粒度是比較大的。
  3. STL極度的追求效率,導致內部比較復雜。比如類型萃取,迭代器萃取。
  4. STL的使用會有代碼膨脹的問題,比如使用vector/vector/vector這樣會生成多份代碼,當然這是模板語法本身導致的

4 string

接下來讓我們開始學習string類吧:

4.1 初識 string

根據上面我們進行的搜索我們可以了解到 :

  1. string是一個代表字符串的對象。
  2. 標準string類提供了類似標準字符容器的接口,而且添加了單字節操作的特性。
  3. string類 是 basic_string類模版的一個實例,使用char類型來實例化basic_string 模版類。
  4. 注意這個類獨立于所使用的編碼來處理字節: 如果使用 multi-byte 或 多長度字符(例如UTF-8編碼),這個類的所有成員(比如 長度和大小),以及該類的迭代器將仍然在該字節(而不是實際的編碼字符)來操作。

可以總結為以下內容:

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

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

4.2 初步使用

構造函數

構造函數功能
string() (重點構造空的string類對象,即空字符串
string(const char* s) (重點用C-string來構造string類對象
string(size_t n, char c)string類對象中包含n個字符c
string(const string&s) (重點拷貝構造函數

來看使用效果:

#include<string>
#include<iostream>
using namespace std;int main() {string s1;string s2("Hello!");string s3(5,'n');string s4(s2);cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;cout << s4 << endl;return 0;
}

流操作符也在string類中進行了重載,輸出很絲滑~
在這里插入圖片描述

成員函數

成員函數作用
begin()返回字符首位置 (迭代器常用 )
end()返回字符結尾 (迭代器常用)
size(重點)返回字符串有效字符長度
length返回字符串有效字符長度
capacity返回空間總大小
empty (重點)檢測字符串釋放為空串,是返回true,否則返回false
clear (重點)清空有效字符
reserve (重點)為字符串預留空間
resize (重點)將有效字符的個數該成n個,多出的空間用字符c填充

來使用一下:

#include<string>
#include<iostream>
using namespace std;int main() {string s1("Hello!");cout << s1 << endl;//有效字符長度cout <<"有效字符長度:" << s1.size() << endl;//字符串所占空間cout << "字符串所占空間:" << s1.capacity() << endl;//實際長度(不包括‘\0')cout << "實際長度:" << s1.length() << endl;//檢查是否為空 (為空返回1 不為空返回0)cout <<"是否為空:" << s1.empty() << endl;//-----------清空試試-------cout << "\n---------清空--------\n";s1.clear();cout << s1 << endl;//有效字符長度cout << "有效字符長度:" << s1.size() << endl;//字符串所占空間cout << "字符串所占空間:" << s1.capacity() << endl;//實際長度(不包括‘\0')cout << "實際長度:" << s1.length() << endl;//檢查是否為空 (為空返回1 不為空返回0)cout << "是否為空:" << s1.empty() << endl;//--------更改大小-------cout << "\n---------更改有效字符個數--------\n";s1.resize(10, 'a');cout << s1 << endl;//有效字符長度cout << "有效字符長度:" << s1.size() << endl;//字符串所占空間cout << "字符串所占空間:" << s1.capacity() << endl;//實際長度(不包括‘\0')cout << "實際長度:" << s1.length() << endl;//檢查是否為空 (為空返回1 不為空返回0)cout << "是否為空:" << s1.empty() << endl;return 0;
}

看看運行效果:
在這里插入圖片描述
這樣,對string就有了一個大概了解。
有些注意事項:

  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不會改變容量大小

5 小試牛刀

家人們! 上鏈接!!!:字符串相加
在這里插入圖片描述
我們來嘗試使用我們剛剛學習的string來解決問題:
首先:我們不能簡單的進行字符串轉換為整數,然后相加,最后轉換為字符串。你問我為什么?
請看VCR:
在這里插入圖片描述
測試用例沒問題,但是Leetcode給我們的數據太大了,longlong都沒辦法容納。
所以我們使用最樸素的算法:豎式算法
很簡單 依次相加 按運算法則進位 得到該位的數值然后插入到string即可。

class Solution {
public:string addStrings(string num1, string num2) {// 從個位開始,所以取字符串末位int i = num1.length() - 1;int j = num2.length() - 1;// 計算所需變量int n1 = 0,n2 = 0 ,carry = 0;//答案string對象string ans = "";//開始計算while(i >= 0 || j >= 0 || carry != 0 ){//這里一定要寫判斷,不然會發生數組越界。n1 = i >= 0 ? num1[i] - '0' : 0; n2 = j >= 0 ? num2[j] - '0' : 0;//得到結構就尾插ans.push_back((n1 + n2 + carry) % 10 + '0');//迭代carry = (n1 + n2 + carry) / 10;i--;j--;}//注意因為我們是尾插的,所以要調換頭尾順序才可以//這里使用 對稱對調法。for(int k = 0 ;k<ans.size()/2;k++){char tmp = ans[k] ;ans[k] = ans[ans.size() - 1 - k];ans[ans.size() - 1 - k] = tmp;}//這個函數更方便,但是不方便解釋了在這里//reverse(ans.begin(),ans.end());return ans;}
};

來看效果奧:
在這里插入圖片描述

牛批!!!!! 過啦!!!!

Thanks?(・ω・)ノ謝謝閱讀!!!

下一篇文章見!!!

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

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

相關文章

解讀OWASP軟件保障成熟度模型SAMM

OWASP軟件保證成熟度模型&#xff08;SAMM&#xff09;可為所有類型的組織分析和改進其軟件安全態勢提供有效和可衡量的方法。OWASP SAMM支持完整的軟件生命周期&#xff0c;包括開發和獲取&#xff0c;并且與技術和過程無關。 1. 簡介 OWASP軟件保證成熟度模型&#xff08;SA…

數據結構 第3章 棧、隊列和數組(一輪習題總結)

第3章 棧、隊列和數組 3.1 棧3.2 隊列3.3 棧與隊列的應用3.4 數組和特殊矩陣 3.1 棧&#xff08;1 10 11 20&#xff09; 3.2 隊列&#xff08;6 12 14 17&#xff09; 3.3 棧與隊列的應用&#xff08;6 11&#xff09; 3.4 數組和特殊矩陣 3.1 棧 T1 棧和隊列具有相同的邏輯…

Java的基本數據類型和引用數據類型

Java的基本數據類型和引用數據類型 Java中的基本數據類型包括整數類型、浮點類型、字符類型和布爾類型&#xff0c;而引用數據類型主要包括類、接口、數組和枚舉。具體介紹如下&#xff1a; 基本數據類型&#xff1a; 整數類型&#xff1a;包括byte、short、int、long&#…

k8s-prometheus監控部署 22

新建項目倉庫并上傳部署prometheus所需的鏡像 開始部署 修改svc訪問方式為LoadBalancer 查看用戶名和密碼 訪問grafana監控頁面 http://192.168.182.103/?????? 修改可視化模板 官方監控模板&#xff1a;https://grafana.com/grafana/dashboards 訪問prometheus監控頁面…

1. vue3-環境準備

1、安裝node.js 如果開發環境上面沒有安裝node.js&#xff0c;需要到node.js官方網站下載node.js。下載安裝后&#xff0c;可以通過npm --version查看nodejs版本 2. 開發工具 開發工具建議使用vscode

知識圖譜1——neo4j

2024年要搞知識圖譜&#xff0c;因此沒有辦法&#xff0c;只能將我之前固守的JDK1.8&#xff0c;升級到JDK21&#xff0c;因為JDK21也是LTS版本&#xff0c;neo4j高版本就不支持JDK8&#xff0c;因此沒有辦法&#xff0c;只有升級了。寫這篇只是一個搭建筆記&#xff0c;我的初…

AJAX 學習筆記(Day3)

「寫在前面」 本文為黑馬程序員 AJAX 教程的學習筆記。本著自己學習、分享他人的態度&#xff0c;分享學習筆記&#xff0c;希望能對大家有所幫助。推薦先按順序閱讀往期內容&#xff1a; 1. AJAX 學習筆記&#xff08;Day1&#xff09; 目錄 3 AJAX 原理 3.1 XMLHttpRequest 3…

springboot心靈治愈交流平臺源碼和論文

本論文主要論述了如何使用JAVA語言開發一個心靈治愈交流平臺 &#xff0c;本系統將嚴格按照軟件開發流程進行各個階段的工作&#xff0c;采用B/S架構&#xff0c;面向對象編程思想進行項目開發。在引言中&#xff0c;作者將論述心靈治愈交流平臺的當前背景以及系統開發的目的&a…

@Transactional--開啟事物后換源報錯

一、問題出現的場景 系統架構設計、每個企業一個企業庫、通過數據源切在平臺庫、和企業庫之間動態切換完成業務操作。 二、跨庫事物失效的原因 1、SpringTransactional不支持跨數據源事物&#xff0c;Spring 事物控制是基于數據庫鏈接進行的&#xff0c;當數據源切換后&#x…

SQL中把datetime 轉為字符串

在 SQL 中&#xff0c;將 datetime 類型的數據轉換為字符串可以使用不同的方法&#xff0c;具體取決于你使用的數據庫系統。以下是一些常見數據庫系統中將 datetime 轉換為字符串的示例&#xff1a; 1. MySQL 在 MySQL 中&#xff0c;你可以使用 DATE_FORMAT() 函數將 dateti…

SketchUp Pro 2023:顛覆傳統,重塑設計世界mac/win版

SketchUp Pro 2023是一款強大的三維建模軟件&#xff0c;專為設計師、建筑師和創意專業人士打造。這款軟件以其直觀易用的界面和強大的功能而著稱&#xff0c;為用戶提供了無限的創意空間。 SketchUp Pro 2023軟件獲取 SketchUp Pro 2023在用戶體驗方面進行了全面的優化&#…

SpringBoot整合rabbitmq-重復消費問題

說明&#xff1a;重復消費的原因大致是生產者將信息A發送到隊列中&#xff0c;消費者監聽到消息A后開始處理業務&#xff0c;業務處理完成后&#xff0c;監聽在告知rabbitmq消息A已經被消費完成途中中斷&#xff0c;也就時說我已經處理完業務&#xff0c;而隊列中還存在當前消息…

Qt|QTreewidget類下函數qt助手詳解說明示例(上)

該系列持續更新&#xff0c;喜歡請一鍵三連&#xff0c;感謝各位大佬。 QT5.14.2 參考官方QT助手 文章目錄 QTreeWidget ClasspropertiesPublic Functions默認構造函數默認析構函數添加根節點void addTopLevelItem(QTreeWidgetItem *item)添加多個根節點void addTopLevelItems…

LeetCode---【和的操作】

目錄 兩數之和我的答案在b站up那里學到的【然后自己復寫】 和為 K 的子數組在b站up那里學到的【然后自己復寫】 三數之和在b站up那里學到的【然后自己復寫】 兩數相加【鏈表】我的半路答案&#xff1a;沒有看到是鏈表在b站up那里學到的【復寫失敗后整理】 兩數之和 我的答案 …

Linux下的權限

1. 操作系統的外殼 在理解Linux權限之前&#xff0c;我們先來吃點小菜。 1.大部分指令都是文件&#xff0c;如果把指令對應的文件刪除了&#xff0c;那么這條指令就使用不了了。 2.用戶執行某種功能的時候&#xff0c;不是直接讓操作系統執行對應的指令的&#xff0c;而是先交…

IIC協議總結

1.基本理解 iic通信協議:雙線制串行通信協議,由時鐘線SCL和數據線SDA構成. 通信方式:主從模式,主設備發起通信,從設備響應通信 2.通信的基本步驟 a.主設備發送一個開始信號&#xff0c;表示開始通信&#xff0c;即啟動I2C 條件&#xff1a;SCL1&#xff0c;SDA出現下降沿 …

Python開源項目月排行 2024年2月

Python 趨勢月報&#xff0c;按月瀏覽往期 GitHub,Gitee 等最熱門的Python開源項目&#xff0c;入選的項目主要參考GitHub Trending,部分參考了Gitee和其他。排名不分先后&#xff0c;都是當前月份內相對熱門的項目。 入選公式&#xff1d;70%GitHub Trending20%Gitee10%其他 …

jvm面試題-背誦版

按照思維導圖抽查和記憶&#xff0c;答案見&#xff1a;四、面試-多線程/并發_scheduledfuture釋放-CSDN博客

Jmeter系列(4) 線程屬性詳解

線程屬性 線程組是配置壓測策略的一個重要環節線程組決定了測試執行的請求數量 線程數 在這里線程數相當于一個虛擬用戶每個線程數大約占內存1M特別注意?? 單臺機器最大線程數不要超過1000&#xff0c;不然可能會造成內存溢出 Ramp-Up時間 所有線程在多長時間內全部啟動…

【網絡工程設計】用GNS3和VMware搭建網絡環境

&#x1f4dd;本文介紹 本文主要是使用GNS3和VMware來搭建網絡環境 &#x1f44b;作者簡介&#xff1a;一個正在積極探索的本科生 &#x1f4f1;聯系方式&#xff1a;943641266(QQ) &#x1f6aa;Github地址&#xff1a;https://github.com/sankexilianhua &#x1f511;Gitee地…