C++23 新成員函數與字符串類型的改動

文章目錄

    • 引言
    • `std::basic_string::contains` 與 `std::basic_string_view::contains` (P1679R3)
      • 功能介紹
      • 示例代碼
      • 優勢
    • 禁止從 `nullptr` 構造 `std::basic_string` 和 `std::basic_string_view` (P2166R1)
      • 背景
      • 改動
      • 影響
    • `std::basic_string_view` 的顯式范圍構造函數 (P1989R2)
      • 功能介紹
      • 示例代碼
      • 優勢
    • `std::basic_string::resize_and_overwrite` (P1072R10)
      • 功能介紹
      • 示例代碼
      • 優勢
    • 用于高效切片的 `std::basic_string::substr` 右值引用重載 (P2438R2)
      • 背景
      • 改動
      • 示例代碼
      • 優勢
    • 總結

引言

C++ 作為一門廣泛應用的編程語言,一直在不斷發展和演進。C++23 作為其發展歷程中的一個重要版本,引入了許多新的特性和改進,其中在字符串處理方面有一些顯著的改動。這些改動不僅提升了代碼的性能和效率,還增強了代碼的安全性和可讀性。本文將詳細介紹 C++23 中幾個重要的字符串相關的新特性,包括 std::basic_string::containsstd::basic_string_view::contains、禁止從 nullptr 構造 std::basic_stringstd::basic_string_viewstd::basic_string_view 的顯式范圍構造函數、std::basic_string::resize_and_overwrite 以及用于高效切片的 std::basic_string::substr 右值引用重載。

std::basic_string::containsstd::basic_string_view::contains (P1679R3)

功能介紹

在 C++23 之前,如果要檢查一個字符串是否包含另一個子字符串,通常會使用 find 函數,并檢查其返回值是否不等于 npos。例如:

#include <iostream>
#include <string>int main() {std::string str = "hello world";if (str.find("world") != std::string::npos) {std::cout << "The string contains 'world'" << std::endl;}return 0;
}

C++23 引入了 contains 函數,使得代碼更加簡潔和直觀。std::basic_string::containsstd::basic_string_view::contains 提供了三個重載版本,分別用于檢查字符串是否包含一個字符串視圖、一個字符或一個以空字符結尾的字符串。以下是函數原型:

constexpr bool contains( std::basic_string_view<CharT,Traits> sv ) const noexcept; // (1) (since C++23)
constexpr bool contains( CharT ch ) const noexcept; // (2) (since C++23)
constexpr bool contains( const CharT* s ) const; // (3) (since C++23)

示例代碼

#include <iostream>
#include <string>
#include <string_view>int main() {std::string str = "hello world";std::string_view sv = "world";if (str.contains(sv)) {std::cout << "The string contains the substring" << std::endl;}if (str.contains('o')) {std::cout << "The string contains the character 'o'" << std::endl;}if (str.contains("hello")) {std::cout << "The string contains the C-style string" << std::endl;}return 0;
}

優勢

使用 contains 函數可以使代碼更加清晰易懂,減少了不必要的代碼量,提高了代碼的可讀性和可維護性。同時,由于其實現通常是內聯的,性能上也不會有明顯的損失。

禁止從 nullptr 構造 std::basic_stringstd::basic_string_view (P2166R1)

背景

在 C++23 之前,從 nullptr 構造 std::basic_stringstd::basic_string_view 的行為是未定義的。這可能會導致程序崩潰或產生不可預期的結果。例如:

#include <iostream>
#include <string>int main() {std::string str(nullptr); // 未定義行為std::cout << str << std::endl;return 0;
}

改動

C++23 通過 P2166R1 提案,禁止了從 nullptr 構造 std::basic_stringstd::basic_string_view。具體來說,std::basic_string_view 的構造函數 basic_string_view( std::nullptr_t ) 被刪除:

basic_string_view( std::nullptr_t ) = delete; // (since C++23)

影響

這一改動提高了代碼的安全性,避免了因從 nullptr 構造字符串而導致的潛在錯誤。如果嘗試從 nullptr 構造字符串,編譯器會報錯,從而在編譯階段就發現問題。

std::basic_string_view 的顯式范圍構造函數 (P1989R2)

功能介紹

std::basic_string_view 是 C++17 引入的一個輕量級的非擁有型字符串表示,它設計用來提供對字符序列的引用。C++23 引入了顯式范圍構造函數,使得可以更方便地從一個范圍構造 std::basic_string_view。以下是構造函數原型:

constexpr basic_string_view() noexcept ; // (1) (since C++17)
constexpr basic_string_view( const basic_string_view& other ) noexcept = default ; // (2) (since C++17)
constexpr basic_string_view( const CharT* s, size_type count ) ; // (3) (since C++17)
constexpr basic_string_view( const CharT* s ) ; // (4) (since C++17)
template< class It, class End >
constexpr basic_string_view( It first, End last ) ; // (5) (since C++20)
template< class R >
constexpr explicit basic_string_view( R&& r ) ; // (6) (since C++23)

示例代碼

#include <iostream>
#include <string>
#include <string_view>int main() {std::string str = "hello world";std::basic_string_view sv(str.begin(), str.end());std::cout << sv << std::endl;return 0;
}

優勢

顯式范圍構造函數提供了更多的靈活性,使得可以直接從迭代器范圍構造 std::basic_string_view,而不需要先構造一個臨時的字符串對象。這在處理字符串切片和子字符串時非常有用。

std::basic_string::resize_and_overwrite (P1072R10)

功能介紹

std::basic_string::resize_and_overwrite 是 C++23 引入的一個新函數,用于調整字符串的大小并覆蓋其內容。該函數接受一個最大大小和一個操作函數作為參數,操作函數用于修改字符串的內容。以下是函數原型:

template< class Operation >
constexpr void resize_and_overwrite( size_type count, Operation op );

示例代碼

#include <iostream>
#include <string>int main() {std::string str = "hello";str.resize_and_overwrite(10, [](char* p, size_t count) {for (size_t i = 0; i < count; ++i) {p[i] = 'a';}return count;});std::cout << str << std::endl;return 0;
}

優勢

該函數避免了在需要修改字符串內容時,先初始化一個合適大小的 std::string 的開銷。它允許直接在字符串的存儲上進行操作,提高了性能。

用于高效切片的 std::basic_string::substr 右值引用重載 (P2438R2)

背景

在 C++23 之前,std::basic_string::substr 函數返回一個新的 std::string 對象,這可能會導致不必要的內存分配和復制。特別是當原字符串是一個右值(臨時對象)時,這種開銷是可以避免的。

改動

C++23 引入了 std::basic_string::substr 的右值引用重載,允許在原字符串是右值時,直接移動其資源,而不是進行復制。這提高了切片操作的效率。

示例代碼

#include <iostream>
#include <string>std::string getString() {return "hello world"; 
}int main() {std::string sub = getString().substr(6); std::cout << sub << std::endl; return 0; 
}

優勢

右值引用重載的 substr 函數在處理臨時字符串時,避免了不必要的復制,提高了性能。特別是在處理大型字符串時,這種優化效果更為明顯。

總結

C++23 在字符串處理方面引入的這些新特性和改動,使得代碼更加簡潔、安全和高效。contains 函數提高了代碼的可讀性,禁止從 nullptr 構造字符串增強了代碼的安全性,顯式范圍構造函數提供了更多的靈活性,resize_and_overwrite 函數避免了不必要的初始化開銷,而 substr 的右值引用重載則提高了切片操作的性能。這些改動將有助于開發者編寫更加優質的 C++ 代碼。

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

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

相關文章

VMware-MySQL主從

MySQL主從 服務器信息 服務器類型角色主機地址主機名稱虛擬機master192.168.40.128test-1虛擬機slave192.168.40.129test-2 Master 配置&#xff08;192.168.40.128&#xff09; 刪除自動生成的配置 /var/lib/mysql/auto.cnf [roottest-1 ~]# rm -rf /var/lib/mysql/auto.…

Java組合、聚合與關聯:核心區別解析

在Java中&#xff0c;組合、聚合和關聯是描述類之間關系的三種不同方式&#xff0c;它們的核心區別在于對象間的依賴強度和生命周期管理。以下是它們的詳細對比&#xff1a; 1. 關聯&#xff08;Association&#xff09; 定義&#xff1a;最基本的類間關系&#xff0c;表示一個…

如何保護網絡免受零日漏洞攻擊?

零日漏洞&#xff08;Zero-Day Vulnerability&#xff09;是指軟件或系統中尚未被廠商發現或修補的安全漏洞。這個名稱中的“零日”意味著&#xff0c;從漏洞被發現到廠商發布修復補丁的時間是零天&#xff0c;也就是說&#xff0c;黑客可以利用這個漏洞進行攻擊&#xff0c;而…

linux快速入門-VMware安裝linux,配置靜態ip,使用服務器連接工具連接,快照和克隆以及修改相關配置信息

安裝VMWare 省略&#xff0c;自己檢索 安裝操作系統-linux 注意&#xff1a;需要修改的我會給出標題&#xff0c;不要修改的直接點擊下一步就可以 選擇自定義配置 選擇稍后安裝操作系統 選擇合適的內存 選擇NAT模式 僅主機模式 虛擬機只能和主機通信&#xff0c;不能上網…

Nest全棧到失業(一):Nest基礎知識掃盲

Nest 是什么? 問你一個問題,node是不是把js拉出來瀏覽器環境運行了?當然,他使用了v8引擎加上自己的底層模塊從而實現了,在外部編輯處理文件等;然后它使用很多方式來發送請求是吧,你知道的什么http.request 或 https.request; 我們瀏覽器中,使用AJAX以及封裝AJAX和http的Axios…

Streamlit 項目知識點總結

目錄 1. 單選框、下拉框格式化 2. 多媒體資源的引用 2.1 搭建一個簡易的http服務器 2.2 約定多媒體資源的輸入格式 2.3 解析多媒體資源 3. 設置頁面的全局背景圖片 4. 輸出流式文本&#xff08;類似打字效果&#xff09; 4.1 使用內置的 st.write_stream 方法實現 4.2…

maven模塊化開發

使用方法 將項目安裝到本地倉庫 mvn install 的作用 運行 mvn install 時&#xff0c;Maven 會執行項目的整個構建生命周期&#xff08;包括 compile、test、package 等階段&#xff09;&#xff0c;最終將構建的 artifact 安裝到本地倉庫&#xff08;默認路徑為 ~/.m2/repos…

(11)Service Mesh架構下Java應用實現零信任安全模型

Service Mesh架構下Java應用實現零信任安全模型 ?? TL;DR: 本文詳細介紹如何在Service Mesh架構中實現零信任安全模型,包括身份認證、授權控制、加密通信和持續監控四大核心技術,以及與Istio、Envoy等組件的集成方案。 目錄 零信任安全模型概述關鍵技術實現最佳實踐Service…

修改 K8S Service 資源類型 NodePort 的端口范圍

在 Kubernetes 中&#xff0c;Service 類型為 NodePort 時&#xff0c;默認分配的端口范圍為 30000~32767。如果你希望使用自定義端口&#xff08;如 8080、8888 等&#xff09;&#xff0c;就需要修改 kube-apiserver 的默認配置。 本文將詳細介紹如何修改 Kubernetes 中 Nod…

MySQL 可觀測性最佳實踐

MySQL 簡介 MySQL 是一個廣泛使用的開源關系型數據庫管理系統&#xff08;RDBMS&#xff09;&#xff0c;以其高性能、可靠性和易用性而聞名&#xff0c;適用于各種規模的應用&#xff0c;從小型網站到大型企業級系統。 監控 MySQL 指標是維護數據庫健康、優化性能和確保數據…

CentOS安裝最新Elasticsearch8支持向量數據庫

大家都知道Elasticsearch是支持向量的存儲和查詢的&#xff0c;今天我們來介紹下如何安裝支持向量數據庫的Elasticsearch &#xff0c; 操作環境是CentOS。 成功安裝截圖 大家進入系統shell&#xff0c;跟我執行下面命令進行安裝。 更新系統 [rootlocalhost ~]# sudo yum u…

SDL2常用函數SDL事件處理:SDL_Event|SDL_PollEvent

SDL_Event SDL_Event是個聯合體&#xff0c;是SDL中所有事件處理的核心。 SDL_Event是SDL中使用的所有事件結構的并集。 只要知道了那個事件類型對應SDL_Event結構的那個成員&#xff0c;使用它是一個簡單的事情。 下表羅列了所有SDL_Event的所有成員和對應類型。 Uint32typ…

webpack吐環境分析

需要解決的問題 扣取下來的webpack文件過大 解決思路 用ast將需要的代碼扣下來 結果展示 實現步驟 第一步&#xff1a;我們得知道需要哪些模塊 在入口處&#xff0c;增加模塊記錄 第二步&#xff0c;分析ast代碼 通過分析發現,key 有三種值 分別為NumbericLiteral、StringLi…

微軟語音合成助手資源下載

微軟語音合成助手資源下載 【下載地址】微軟語音合成助手資源下載 微軟語音合成助手是一款基于先進AI技術的文本轉語音工具&#xff0c;能夠將文字內容快速轉換為自然流暢的語音。它支持高度自定義的語音參數&#xff0c;包括語速、音調、發音和停頓等&#xff0c;滿足多樣化需…

青少年編程與數學 02-020 C#程序設計基礎 01課題、C#編程概要

青少年編程與數學 02-020 C#程序設計基礎 01課題、C#編程概要 一、微軟.NET開發平臺1. 核心組件2. 特點3. 應用場景4. 開源與社區5. 版本與更新6. 學習資源 二、C# 編程語言1. 歷史背景2. 語言特性&#xff08;1&#xff09;面向對象&#xff08;2&#xff09;類型安全&#xf…

圖片文件未正確加載?—— Webpack 無法正確解析圖片,生成了一個空的 Base64 URL

如果你打印出的圖片 URL 是 data:image/png;base64, 后面沒有實際的 Base64 數據&#xff0c;可能有以下幾種原因&#xff1a; ??1. 圖片文件未正確加載?? ??可能原因??&#xff1a;圖片路徑錯誤&#xff0c;導致 Webpack 無法正確解析圖片&#xff0c;生成了一個空的…

3D打印仿造+ AI大腦賦能,造出會思考的全景相機

在自然界的生存競賽里&#xff0c;節肢動物堪稱視覺界的 "卷王"&#xff01;那些長著復眼的小機靈鬼&#xff0c;比如蜜蜂、蜻蜓&#xff0c;別看個頭小&#xff0c;視覺能力卻超強。 現在&#xff0c;科學家把它們的眼睛 " 偷"過來啦 —— 不是真偷&…

rabbitmq單機多實例部署

RabbitMQ 單實例部署 單實例部署是指在一臺服務器上運行一個 RabbitMQ 實例。這種部署方式適用于小型應用或開發環境,配置簡單,資源占用較少。單實例部署的核心是安裝 RabbitMQ 并啟動服務,通常需要配置 Erlang 環境,因為 RabbitMQ 是基于 Erlang 編寫的。單實例部署的優勢…

知識宇宙-職業篇:后端工程師

名人說&#xff1a;博觀而約取&#xff0c;厚積而薄發。——蘇軾《稼說送張琥》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 目錄 一、后端工程師的定義與職責1. 什么是后端工程師&#xff1f;2. 主要工作職責 二、…

機試 | vector/array Minimum Glutton C++

題目地址 &#xff1a; C - Minimum Glutton #include<stdio.h> #include<iostream> #include<vector> #include<algorithm> using namespace std; int main() {//N:菜肴數&#xff0c;X&#xff1a;總甜度閾值&#xff0c;Y&#xff1a;總咸度閾值int…