C++那些事之string那些事

C++那些事之string那些事

  • C++11

  • C++17

  • C++20

  • C++23

  • 結論

當我們使用C++時,庫的基礎知識比較熟悉,尤其是在C++中創建字符串時使用的std::string。這無疑是對舊的C風格“字符串”(使用以空字符結尾的字符數組)的一種改進。然而,C++標準庫在C++17和C++20中引入了更有用的組件,可以幫助你編寫更高效的代碼。

在頭文件中,std::basic_string類是一個模板類,為各種字符串類型提供了特化,包括常見字符串的std::string(即std::basic_string)和寬字符串的std::wstring(即std::basic_string<wchar_t>)。

還有一些固定寬度的特定字符串,比如std::u32string(即std::basic_string<char32_t>)和std::u16string(即std::basic_string<char16_t>)。

在C++20中,引入了char8_t,這也帶來了std::u8string(即std::basic_string<char8_t>)。我不知道為什么要等到C++20才引入char8_t,那么提個問題char16_t和char32_t在哪個標準存在呢?留言區見

注:本篇文章的所有代碼已同步至星球,更多優質內容一起探討。

b3e7e3cfc11589cc7e8f4654fd61e19a.jpeg

C++11

在C++11標準下,字符串處理主要依賴于std::string類,這是一個動態分配內存的字符串類。此外,引入了新的固定寬度字符串類型,如std::u32stringstd::u16string,為處理Unicode字符提供了更好的支持。

#include?<iostream>
#include?<string>int?main()?{//?使用std::stringstd::string?str?=?"Hello,?C++11!";//?使用std::u32string和std::u16stringstd::u32string?u32str?=?U"Hello,?Unicode!";std::u16string?u16str?=?u"Hello,?Unicode!";std::cout?<<?str?<<?std::endl;std::wcout?<<?u32str?<<?std::endl;std::wcout?<<?u16str?<<?std::endl;return?0;
}

C++17

在C++17中,引入了<string_view>頭文件,提供了一種輕量級的只讀替代方案,用于使用頭文件中的字符串類型。這些字符串視圖類似于先前描述的字符串。例如,std::u32string的<string_view>等價物是std::u32string_view(即std::basic_string_view<char32_t>)。

這在需要讀取字符串但不需要修改它的函數中特別有用。與為函數創建字符串副本不同,我們可以簡單地查看現有字符串!此外,<string_view>非常靈活,不僅可以將C++樣式的字符串轉換為字符串視圖,甚至可以將C樣式的字符串轉換為字符串視圖。以下是演示std::string_view簡單用法的示例:

#include?<iostream>
#include?<string>
#include?<string_view>void?printString(std::string_view?str)?{std::cout?<<?str?<<?std::endl;
}int?main()?{std::string_view?strv{"strv"};?//?C++?string_viewprintString(strv);std::string?str{"str"};?//?C++?stringprintString(str);char?cstr[]?=?"cstr";?//?C-style?stringprintString(cstr);return?0;
}

輸出:

strv
str
cstr

在這個例子中,printString函數以std::string_view作為參數,這使得這個函數非常輕量級和靈活,因為沒有制作任何字符串的副本,這個函數可以通過傳遞C和C++樣式的字符串以各種方式使用。

C++20

在C++20中,引入了一些新的有用成員函數,包括starts_with(…)和ends_with(…)。正如名稱所示,這些函數確定一個字符串(或字符串視圖)是否以某個字符或某個std::string_view開頭/結尾。以下是一個簡單的例子:

#include?<cassert>
#include?<string>
#include?<string_view>int?main()?{const?std::string?str{"Hello?World!"};assert(str.starts_with('H'));assert(str.ends_with('!'));assert(str.starts_with("Hello"));?//?隱式轉換為std::string_viewassert(str.ends_with("World!"));?//?隱式轉換為std::string_viewreturn?0;
}

C++23

C++23中引入了contains,用于檢查字符串是否包含指定的子字符串。

//?這是一個假設的C++23示例,實際上并不可用
#include?<iostream>
#include?<string>int?main()?{std::string?str?=?"C++23?introduces?contains?function.";if?(str.contains("introduces"))?{std::cout?<<?"The?string?contains?'introduces'."?<<?std::endl;}?else?{std::cout?<<?"The?string?does?not?contain?'introduces'."?<<?std::endl;}return?0;
}

https://en.cppreference.com/w/cpp/string/basic_string/contains

結論

在處理新的C++代碼中的字符串時,應考慮使代碼盡可能靈活和內存高效。使用<string_view>可以極大地幫助這些努力。此外,考慮使用最新的字符串成員函數,如starts_with和ends_with,以獲得可讀且易于實現的字符串解析代碼。而C++23使得contains計算更加簡單,越來越現代化了。

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

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

相關文章

【Hello Go】Go語言網絡編程

Go語言網絡編程 Go語言程序服務端客戶端 Http程序 有關網絡的基本知識我之前的博客介紹的很詳細 這里就不再贅述了 這里主要講解下Go語言網絡編程的語法 網絡基礎 協議 Go語言程序 我們建立一個tcp鏈接的步驟為 socket bind listen accept 但是在Go語言中 我們并不需要前兩…

office word 使用筆記

office word 使用筆記 1. 功能1.1 格式快捷鍵1.2 復選框 2 遇到過的問題2.1 表格標題和表格距離過大 1. 功能 1.1 格式快捷鍵 復制格式&#xff1a;ctrl shift c 粘貼格式&#xff1a;ctrl shift v 1.2 復選框 方框位置和類型&#xff1a;“插入——高級符號——字體”選…

【追求卓越08】算法--排序算法

引導 今天開始介紹我們在工作中經常遇到的算法--排序。排序算法有很多&#xff0c;我們主要介紹以下幾種&#xff1a; 冒泡排序 插入排序 選擇排序 歸并排序 快速排序 計數排序 基數排序 桶排序 我們需要了解每一種算法的定義以及實現方式&#xff0c;并且掌握如何評…

LeetCode [簡單] 1. 兩數之和

給定一個整數數組 nums 和一個整數目標值 target&#xff0c;請你在該數組中找出 和為目標值 target 的那 兩個 整數&#xff0c;并返回它們的數組下標。 你可以假設每種輸入只會對應一個答案。但是&#xff0c;數組中同一個元素在答案里不能重復出現。 你可以按任意順序返回…

Leetcode——121 買賣股票的最佳時機

(超時。。。。。。&#xff09;除了暴力法我是真的。。。。。。 class Solution {public int maxProfit(int[] prices) {int len prices.length;int max0;for(int i0;i<len-1;i){for(int ji1;j<len;j){int income prices[j] - prices[i];if(income>max){maxincome;…

閃存組織結構概念

文章目錄 一、幾種不同類型閃存的參數&#xff1a;二、組織結構三、塊&#xff08;Block&#xff09;的結構擦除動作原理&#xff1a;寫操作讀操作 一、幾種不同類型閃存的參數&#xff1a; 參數項SLCMLCTLCQLC讀取時間/us20~2555~11075~170120~200寫入時間/us50~100400~15008…

Android設計模式--模板方法模式

一&#xff0c;定義 定義一個操作中的算法的框架&#xff0c;而將一些步驟延遲到子類中&#xff0c;使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。 在面向對象的開發過程中&#xff0c;通常會遇到這樣一個問題&#xff0c;我們知道一個算法所需的關鍵步…

MR導游情景英語虛擬仿真實訓系統應用

MR導游情景英語虛擬仿真實訓系統應運而生。系統旨在為學生提供一種全新的培訓方式。 系統采用先進的MR混合現實技術&#xff0c;通過虛擬現實技術創建逼真的旅游場景&#xff0c;讓學生能夠身臨其境地體驗各種旅游活動。學生可以在系統中扮演導游的角色&#xff0c;與其他同學…

docker報錯standard init linux.go:228 exec user process caused: exec format error

1、報錯 使用Dockerfile自己做的服務鏡像&#xff0c;docker run時啟動失敗&#xff0c;報錯如下&#xff1a; standard init linux.go:228 exec user process caused: exec format error2、原因一 當前服務器的CPU架構和構建鏡像時的CPU架構不兼容。比如做鏡像是在arm機器下…

競賽選題 車道線檢測(自動駕駛 機器視覺)

0 前言 無人駕駛技術是機器學習為主的一門前沿領域&#xff0c;在無人駕駛領域中機器學習的各種算法隨處可見&#xff0c;今天學長給大家介紹無人駕駛技術中的車道線檢測。 1 車道線檢測 在無人駕駛領域每一個任務都是相當復雜&#xff0c;看上去無從下手。那么面對這樣極其…

云原生正在重塑軟件的整個生命周期(內附資料)

隨著企業數字化轉型進程的發展&#xff0c;企業面臨著新舊商業形態的劇變&#xff0c;顛覆和重構時刻都在發生。 企業需要更加快速地感知用戶側的需求變化并做出調整&#xff0c;才有可能在競爭中持續積累優勢。業務的個性化、敏捷化、智能化需求日益突顯&#xff0c;數字化應…

git merge 和 git rebase

一、是什么 在使用 git 進行版本管理的項目中&#xff0c;當完成一個特性的開發并將其合并到 master 分支時&#xff0c;會有兩種方式&#xff1a; git merge git rebasegit rebase 與 git merge都有相同的作用&#xff0c;都是將一個分支的提交合并到另一分支上&#xff0c;…

模版模式 設計模式

設計模式 總目錄 https://preparedata.blog.csdn.net/article/details/134512591 文章目錄 設計模式 總目錄一、案例二、抽象類模版 AbstractOrderTemplate&#xff08;頂層的訂單抽象類&#xff09;三、執行模版的實現類3.1 默認執行模版 DefaultOrder3.2 其他執行模版 Simlp…

19.悲觀鎖與樂觀鎖解析

1.悲觀鎖 悲觀鎖比較悲觀&#xff0c;它認為如果不鎖住這個資源&#xff0c;別的線程就會來爭搶&#xff0c;就會造成數據結果錯誤&#xff0c;所以悲觀鎖為了確保結果的正確性&#xff0c;會在每次獲取并修改數據時&#xff0c;都把數據鎖住&#xff0c;讓其他線程無法訪問該…

2023年亞太地區數學建模大賽 問題B

玻璃溫室中的微氣候法規 溫室作物的產量受到各種氣候因素的影響&#xff0c;包括溫度、濕度和風速[1]。其中&#xff0c;適宜的溫度和風速是植物生長[2]的關鍵。為了調節玻璃溫室內的溫度、風速等氣候因素&#xff0c;溫室的設計通常采用帶有溫室風扇的通風系統&#xff0c;如…

docker報錯

安裝 docker報錯&#xff1a; Docker Desktop requires the Server service to be enabled. 解決方法&#xff1a; 管理員身份打開cmd&#xff0c;輸入&#xff1a; services.msc開啟 server 服務。 docker啟動報錯&#xff1a; 打開 docker 界面報錯&#xff1a; Docke…

rabbit MQ的延遲隊列處理模型示例(基于SpringBoot延時插件實現)

rabbitMQ安裝插件rabbitmq-delayed-message-exchange 交換機由此type 表示組件安裝成功 生產者發送消息時設置延遲值 消息在交換機滯納至指定延遲后&#xff0c;進入隊列&#xff0c;被消費者消費。 組件注解類&#xff1a; package com.esint.configs;import org.springfra…

OpenAI再次與Altman談判;ChatGPT Voice正式上線

11月22日&#xff0c;金融時報消息&#xff0c;OpenAI迫于超過700名員工聯名信的壓力&#xff0c;再次啟動了與Sam Altman的談判&#xff0c;希望他回歸董事會。 在Sam確定加入微軟后&#xff0c;OpenAI超700名員工簽署了一封聯名信&#xff0c;要求Sam和Greg Brockman&#x…

Java檢測網絡是否正常通訊

Java是一種流行的編程語言&#xff0c;可以用于開發網絡應用程序。在網絡應用程序中&#xff0c;檢測IP地址和端口是否通常是必要的。本文將介紹如何使用Java檢測IP和端口。 Java檢測IP和端口的方法非常簡單。我們可以使用Java的Socket類來實現。下面的代碼片段演示了如何檢測…

用于 syslog 收集的協議:TCP、UDP、RELP

系統日志是從 Linux/Unix 設備和其他網絡設備&#xff08;如交換機、路由器和防火墻&#xff09;生成的日志 可以通過將 syslog 聚合到稱為 syslog 服務器、syslog 守護程序或 syslogd 的服務器來集中 syslog。在TCP、UDP和RELP協議的幫助下&#xff0c;系統日志從設備傳輸到系…