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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…