探索 C++ 标准库:std::string 库函数用法示例

目录

引言

一、构造函数

1.1 string()

1.2 string (const string& str)

1.3 string (const string& str, size_t pos, size_t len = npos)

1.4 string (const char* s)

1.5 string (const char* s, size_t n)

1.6 string (size_t n, char c)​

 二、容量相关函数

2.1 size_t size() const

2.2 size_t length() const

2.3 size_t max_size() const

2.4 void resize (size_t n)&&void resize (size_t n, char c)

2.5 size_t capacity() const

2.6 void reserve (size_t n = 0)

2.7 void clear()

2.8 bool empty() const

2.9  void shrink_to_fit()

 三、修改操作相关函数

3.1  string& operator+=

3.2 append 

3.3 void push_back (char c)

3.4 assign 

3.5 insert

3.6  erase

3.7 replace

 3.8 void swap (string& str)

3.9 void pop_back()

结语


引言

在现代编程世界中,字符串是不可或缺的基本元素,而 C++ 标准库中的 std::string则是在处理和操作字符串时的得力工具。无论是从构造字符串开始,还是进行子串提取、连接、比较等操作,std::string 为开发者提供了广泛的功能,使字符串处理变得更加高效和便捷。

在本文中,我们将深入探索 std::string 类的多种功能和用法示例,帮助您更好地理解如何利用这些功能解决实际编程问题。无论您是初学者还是有经验的开发者,这些示例都将为您打开掌握字符串处理技巧的大门。

一、构造函数

1.1 string()

创建空字符串(默认构造函数) 

 1.2 string (const string& str)

 ✨拷贝构造函数

 1.3 string (const string& str, size_t pos, size_t len = npos)

✨子串构造函数

参数解释 

 pos

一个表示起始位置的无符号整数值。

指定从源字符串的哪个位置开始提取子串,从 0 开始计数。

len(可选)

一个表示提取的子串的长度的无符号整数值。

默认情况下,如果没有指定该参数,将提取从起始位置 pos 到源字符串的末尾的全部内容

如果指定了 len,则提取从位置 pos 开始的连续 len 个字符。

如果len参数设置得很大,超过了源字符串的长度,构造函数会自动截取到源字符串的末尾为止,确保不会超出源字符串的范围。

1.4 string (const char* s)

✨从 C 字符串构造

1.5 string (const char* s, size_t n)

✨使用指向字符数组的指针以及长度来创建新字符串对象

1.6 string (size_t n, char c)

✨填充构造函数

 二、容量相关函数

2.1 size_t size() const

✨获取有效字符长度

 2.2 size_t length() const

 ✨获取有效字符长度(同size函数)

2.3 size_t max_size() const

✨ 返回字符串对象的最大可能大小(以字符为单位)

 2.4 void resize (size_t n)&&void resize (size_t n, char c)

void resize(size_t n)

这个函数用于将字符串的大小更改为指定的大小 n,并且不提供填充字符。当新大小 n 大于当前大小时,它会将字符串扩展为新大小并用空字符填充。如果 n 小于当前大小,超出部分的字符将被截断。如果 n 等于当前大小,则不会执行任何操作。

void resize(size_t n, char c)

这个函数也用于将字符串的大小更改为指定的大小 n,但是提供了一个填充字符 c。如果新大小 n 大于当前大小,字符串将增长并用填充字符 c 填充。如果 n 小于当前大小,超出部分的字符将被截断。如果 n 等于当前大小,则不会执行任何操作。

当n大于当前字符串容量时会自动进行扩容。

2.5 size_t capacity() const

 ✨用于获取字符串对象当前分配的内存容量(以字符为单位)

 2.6 void reserve (size_t n = 0)

  ✨用于保留字符串对象的内存以容纳至少 n 个字符

✨解释一下此处容量为30的问题

笔者使用的Clion进行演示。创建空字符串或有效字符小于等于15时,编译器都会开辟15个字节的空间,当使用该函数进行扩容时,该编译器自动扩容2倍,因为该函数说明也是至少开辟到n个空间(如果n大于当前capacity),不同编译器、平台实现有所不同。

✨若n小于当前容量则不做处理

如果传递给 reserve 函数的参数 n 值比当前字符串对象的容量小,那么函数会忽略该请求,不会进行任何内存调整或重新分配。

2.7 void clear()

 ✨用于清空字符串对象的内容,将其变为空字符串,分配的内存空间仍然保留。

2.8 bool empty() const

 ✨用于检查字符串对象是否为空,即其中是否没有字符。

#include <iostream>
#include <string>int main() {std::string emptyString = ("");std::string nonEmptyString =("Hello, World!");// 使用 empty() 函数检查字符串是否为空if (emptyString.empty()) {std::cout << "Empty String is empty!" << std::endl;} else {std::cout << "Empty String is not empty!" << std::endl;}if (nonEmptyString.empty()) {std::cout << "Non-Empty String is empty!" << std::endl;} else {std::cout << "Non-Empty String is not empty!" << std::endl;}return 0;
}

2.9  void shrink_to_fit()

✨用于请求字符串对象释放多余的内存,使其内存使用与字符串的大小相匹配。

✨不保证一定会减小内存,因为内存管理取决于底层实现。

✨Clion在此情况就饿没有做处理,或许是因为它默认15字节为最小容量。

那让我们来试试扩大容量再试试

处理啦对吧!

 三、修改操作相关函数

3.1  string& operator+=

 ✨用于将一个字符串或字符序列追加到当前字符串的末尾。

string& operator+= (const string& str)

这个运算符将另一个 std::string 对象 str 追加到当前字符串的末尾,并返回当前字符串的引用。相当于将 str 的内容添加到当前字符串的末尾。

string& operator+= (const char* s)

这个运算符将以空字符结尾的 C 风格字符串(字符数组) s 追加到当前字符串的末尾,并返回当前字符串的引用。相当于将 s 的内容添加到当前字符串的末尾。

string& operator+= (char c)

这个运算符将字符 c 追加到当前字符串的末尾,并返回当前字符串的引用。

#include <iostream>
#include <string>int main() {std::string myString = ("Hello");// 使用 += 运算符将另一个字符串追加到当前字符串std::string appendString = " there";myString += appendString;// 使用 += 运算符将 C-风格字符串追加到当前字符串const char* cStyleStr = " and";myString += cStyleStr;// 使用 += 运算符将字符追加到当前字符串char c = '!';myString += c;std::cout << "Modified String: " << myString << std::endl;return 0;
}

3.2 append 

 append函数+=运算符重载的效果类似。解释其中部分。

 string& append(const string& str, size_t subpos, size_t sublen)

这个函数将另一个 std::string 对象 str 中从索引 subpos 开始的长度为 sublen 的子串追加到当前字符串的末尾,并返回当前字符串的引用。

sublen 太大时, 函数可能会引发未定义的行为或错误。在使用这个函数时,需要确保 subpossublen 的值不会越界到超出 str 的有效范围。

string& append(const char* s, size_t n)

这个函数将 C 风格字符串(字符数组) s 中的n 个字符追加到当前字符串的末尾,并返回当前字符串的引用。

#include <iostream>
#include <string>int main() {std::string myString = ("Hello");// 使用不同的 append 函数将不同内容追加到当前字符串myString.append(" there");  // 追加另一个字符串myString.append(" and more", 0, 4);  // 追加子串myString.append("!", 1);  // 追加单个字符myString.append(2, '*');  // 追加重复字符std::cout << "Modified String: " << myString << std::endl;return 0;
}

3.3 void push_back (char c)

✨用于将一个字符 c 追加到字符串的末尾,扩展字符串的内容。

#include <iostream>
#include <string>int main() {std::string myString("Hello");// 使用 push_back 函数将字符追加到当前字符串myString.push_back(' ');  // 添加一个空格字符myString.push_back('W');  // 添加字符 'W'std::cout << "Modified String: " << myString << std::endl;return 0;
}

3.4 assign 

✨可以理解为赋值函数。其中大部分参数与append函数类似,此处不赘述。

✨append是在末尾追加,assign时相当于重新赋值。

#include <iostream>
#include <string>int main() {std::string myString;// 使用 assign 函数分配不同内容给当前字符串myString.assign("Hello");  // 分配字符串std::cout << "String after assign: " << myString << std::endl;myString.assign(" there", 1, 4);  // 分配子串std::cout << "String after assign (substring): " << myString << std::endl;myString.assign("World");  // 重新分配字符串std::cout << "String after re-assign: " << myString << std::endl;myString.assign(3, '!');  // 分配重复字符std::cout << "String after assign (repeat): " << myString << std::endl;return 0;
}

 3.5 insert

 ✨参数亦与之前介绍的函数类似,相信读者能够很容易理解。

#include <iostream>
#include <string>int main() {std::string myString = ("Hello World");// 使用 insert 函数在不同位置插入内容myString.insert(5, " there");  // 在位置 5 插入字符串std::cout << "String after insert: " << myString << std::endl;myString.insert(11, "!", 1);   // 在位置 11 插入字符 '!'std::cout << "String after insert (char): " << myString << std::endl;myString.insert(0, 3, '*');    // 在位置 0 插入重复字符 '*'std::cout << "String after insert (repeat): " << myString << std::endl;return 0;
}

3.6  erase

✨用于从字符串中删除从位置 pos 开始的长度为 len 的字符序列。 

✨默认值 npos 表示删除从 pos 开始的所有字符直到字符串的末尾。

#include <iostream>
#include <string>int main() {std::string myString("Hello, World!");// 使用 erase 函数删除字符序列myString.erase(5, 7);  // 从位置 5 开始,删除 7 个字符std::cout << "Modified String: " << myString << std::endl;return 0;
}

如果 len 的值超出了要删除的字符序列的实际长度,erase 函数会从指定位置开始删除所有可用的字符,直到字符串的末尾。这不会引发错误,函数会尽量删除尽可能多的字符,而不会超出字符串的范围。

3.7 replace

string& replace(size_t pos, size_t len, const string& str)

在位置 pos 处开始,用另一个 std::string 对象 str 的内容替换长度为 len 的字符序列,并返回当前字符串的引用。

string& replace(size_t pos, size_t len, const char* s)

在位置 pos 处开始,用以空字符结尾的 C 风格字符串(字符数组) s 替换长度为 len 的字符序列,并返回当前字符串的引用。

string& replace(size_t pos, size_t len, const char* s, size_t n)

在位置 pos 处开始,用 C 风格字符串(字符数组) s 中的前 n 个字符替换长度为 len 的字符序列,并返回当前字符串的引用。

如果 len 的值超出了要替换的字符序列的实际长度replace 函数会从指定位置开始尽可能多地替换字符,直到字符串的末尾。这不会引发错误,函数会尽量替换尽可能多的字符,而不会超出字符串的范围。

如果 len 的值小于要替换的字符序列的实际长度,函数会从指定位置开始替换指定长度的字符序列,然后字符串会收缩,被删除的字符序列会被新的字符序列取代。

#include <iostream>
#include <string>int main() {std::string myString("Hello, World!");// 使用 replace 函数替换内容,len 超出了字符串的实际长度myString.replace(7, 20, "Universe");  // 从位置 7 开始,替换 20 个字符(超出实际长度)std::cout << "String after replace: " << myString << std::endl;myString.assign("Hello, World!");myString.replace(7, 5, "Hi, Universe");  // 从位置 7 开始,替换 5 个字符(字符串长度对应不上)std::cout << "String after replace (len mismatch): " << myString << std::endl;return 0;
}

 3.8 void swap (string& str)

 ✨用于交换当前字符串对象与另一个字符串对象 str 之间的内容。

#include <iostream>
#include <string>int main() {std::string firstString = "Hello";std::string secondString = "World";std::cout << "Before swap:" << std::endl;std::cout << "First String: " << firstString << std::endl;std::cout << "Second String: " << secondString << std::endl;// 使用 swap 函数交换两个字符串的内容firstString.swap(secondString);std::cout << "\nAfter swap:" << std::endl;std::cout << "First String: " << firstString << std::endl;std::cout << "Second String: " << secondString << std::endl;return 0;
}

如果交换的两个字符串的容量不同,swap 函数会将容量一并交换,从而使得交换后的字符串对象具有对应的容量。这意味着,在交换后,字符串对象的内容和容量都会被交换。 

#include <iostream>
#include <string>int main() {std::string firstString = "Hello";std::string secondString = "World!!xxxxxxxxxxxxxxxxxx";std::cout << "Before swap:" << std::endl;std::cout << "First String: " << firstString << ", Capacity: " << firstString.capacity() << std::endl;std::cout << "Second String: " << secondString << ", Capacity: " << secondString.capacity() << std::endl;// 使用 swap 函数交换两个字符串的内容和容量firstString.swap(secondString);std::cout << "\nAfter swap:" << std::endl;std::cout << "First String: " << firstString << ", Capacity: " << firstString.capacity() << std::endl;std::cout << "Second String: " << secondString << ", Capacity: " << secondString.capacity() << std::endl;return 0;
}

3.9 void pop_back()

✨用于从字符串的末尾移除一个字符,缩小字符串的长度。

#include <iostream>
#include <string>int main() {std::string myString = "Hello";std::cout << "Before pop_back: " << myString << std::endl;// 使用 pop_back 函数移除字符串末尾的字符myString.pop_back();std::cout << "After pop_back: " << myString << std::endl;return 0;
}

结语

掌握了C++的“字符串大法”,让你的程序丰富多彩!😎 通过std::string类,你可以玩转连接、查找、插入、删除等操作,为你的代码增添绚丽色彩。无论你是刚入门还是老手,掌握这些技巧都将让你在编程的舞台上更加游刃有余。感谢阅读本文,愿你用“字符串魔法”创造出令人惊艳的程序世界!🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/90078.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

报名小程序PowerActivity配置

https://github.com/zhihuliukanshan/PowerActivity/assets/100545532/9b3e2a3b-f810-4c1f-90d5-9596d99abbd3 导入代码后&#xff0c;需要配置的位置有&#xff1a; 1、miniprogram\setting\setting.js中的CLOUD_ID&#xff1a; module.exports {//### 环境相关 CLOUD_ID: …

如何在iPhone手机上修改手机定位和模拟导航?

如何在iPhone手机上修改手机定位和模拟导航&#xff1f; English 首先&#xff0c;你需要在Mac电脑上下载安装 Location Simulator/定位模拟工具 和 Runner 这两款应用程序。 完成安装后&#xff0c;打开软件&#xff0c;并用USB连接手机设备 修改iPhone手机定位和模拟导航 …

HTTPS安全通信

HTTPS,TLS/SSL Hyper Text Transfer Protocol over Secure Socket Layer,安全的超文本传输协议,网景公式设计了SSL(Secure Sockets Layer)协议用于对Http协议传输的数据进行加密,保证会话过程中的安全性。 使用TCP端口默认为443 TLS:(Transport Layer Security,传输层…

Windows 11 家庭中文版找不到组策略文件gpedit.msc

最近因为调整日期问题需要用到组策略文件gpedit.msc,但是发现找不到文件 在按键盘 winR 打开运行界面输入 gpedit.msc 回车 Windows找不到文件’gpedit.msc’。请确定文件名是否正确后&#xff0c;再试-次。 检查电脑Windows系统版本 是 Windows 11 家庭中文版 果断早网上搜…

Idea 快捷键整理

Idea快捷键和自动代码补全汇总 idea快捷键汇总 Ctrl 快捷键说明Ctrl F在当前文件进行文本查找 &#xff08;必备&#xff09;Ctrl R在当前文件进行文本替换 &#xff08;必备&#xff09;Ctrl Z撤销 &#xff08;必备&#xff09;Ctrl Y删除光标所在行 或 删除选中的行 &am…

应急响应-钓鱼邮件的处理思路溯源及其反制

0x00 钓鱼邮件的危害 1.窃取用户敏感信息&#xff0c;制作虚假网址&#xff0c;诱导用户输入敏感的账户信息后记录 2.携带病毒木马程序&#xff0c;诱导安装&#xff0c;使电脑中病毒木马等 3.挖矿病毒的传输&#xff0c;勒索病毒的传输等等 0x01 有指纹的钓鱼邮件的溯源处理…

Python Opencv实践 - 图像旋转

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR)#图像旋转 #Opencv中的旋转&#xff0c;首先通过cv.getRotationMatrix2D获得旋转矩阵 #cv.getRotationMatrix2D(center,ang…

Vue 安装开发者工具

1.下载开发者工具&#xff0c;下载地址&#xff1a;http://book.wiyp.top/App/Vue3开发者工具-谷歌/Vue3.crx 2.打开谷歌浏览器&#xff0c;点击扩展&#xff0c;点击管理扩展程序。 3.开启开发者模式&#xff0c;将 Vue3 开发者工具文件拖拽到浏览器中进行安装。 注&#xff…

测试人进阶技能:单元测试报告应用指南

为什么需要单元测试 从产品角度而言&#xff0c;常规的功能测试、系统测试都是站在产品局部或全局功能进行测试&#xff0c;能够很好地与用户的需要相结合&#xff0c;但是缺乏了对产品研发细节&#xff08;特别是代码细节的理解&#xff09;。 从测试人员角度而言&#xff0…

鸿蒙开发学习笔记2——实现页面之间跳转

鸿蒙开发学习笔记2——实现页面之间跳转 问题背景 上篇文章中&#xff0c;介绍了鸿蒙开发如何新建一个项目跑通hello world&#xff0c;本文将介绍在新建的项目中实现页面跳转的功能。 问题分析 ArkTS工程目录结构&#xff08;FA模型&#xff09; 各目录和路径的介绍如下…

【C++】开源:spdlog跨平台日志库配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍spdlog日志库配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下…

Photoshop快捷键大全

Photoshop是一款非常强大的图像处理软件&#xff0c;它提供了许多快捷键&#xff0c;可以帮助用户更快地完成操作。熟练掌握这些快捷键&#xff0c;可以大大提高工作效率&#xff0c;让您更加专注于创作。 Photoshop快捷键汇总&#xff1a; 一、基本操作快捷键 1. 新建文档…

jQuery-表单验证

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>表单验证</title></head><body&g…

TCGA数据下载推荐:R语言easyTCGA包

#使用easyTCGA获取数据 #清空 rm(listls()) gc() # 安装bioconductor上面的R包 options(BioC_mirror"https://mirrors.tuna.tsinghua.edu.cn/bioconductor") if(!require("BiocManager")) install.packages("BiocManager") if(!require("TC…

Spring Boot实现第一次启动时自动初始化数据库流程详解

随着互联网的发展项目中的业务功能越来越复杂&#xff0c;有一些基础服务我们不可避免的会去调用一些第三方的接口或者公司内其他项目中提供的服务&#xff0c;但是远程服务的健壮性和网络稳定性都是不可控因素。 在测试阶段可能没有什么异常情况&#xff0c;但上线后可能会出…

QT:UI控件(按设计师界面导航界面排序)

基础部分 创建新项目&#xff1a;QWidget&#xff0c;QMainWindow&#xff0c;QDialog QMainWindow继承自QWidget&#xff0c;多了菜单栏; QDialog继承自QWidget&#xff0c;多了对话框 QMainWindow 菜单栏和工具栏&#xff1a; Bar: 菜单栏&#xff1a;QMenuBar&#xff0…

UI设计师的主要职责说明(合集)

UI设计师的主要职责说明1 职责&#xff1a; 1、负责公司移动端、PC端产品相关的交互、UI等设计 2、负责公司宣传册、海报、运营物料、banner等设计 3、负责公司品牌相关的视觉设计 3、制定相关设计规范&#xff0c;提高产品的可用性、不断优化产品体验; 4、与PM、运营紧密…

接口测试实战,Jmeter正则提取响应数据-详细整理,一篇打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 在测试时&#xf…

大数据--难点--地图的制作

地图一直是亮点也是难点&#xff0c;刚刚进公司的时候也很难懂~~做出来的也很难看 纯CSS3使用vw和vh视口单位实现h5页面自适应&#xff0c;gulp自动监听sass改动并保存到css中 当修改了sass里面的代码后&#xff0c;gulp会自动监听修改内容并同名保存到css文件夹中&#xff0…

uni-app中使用pinia

目录 Pinia 是什么&#xff1f; uni-app 使用Pinia main.js 中引用pinia 创建和注册模块 定义pinia方式 选项options方式 定义pinia 页面中使用 pinia选项options方式 函数方式 定义pinia 页面中使用 函数方式 定义的pinia Pinia 是什么&#xff1f; Pinia&#xff0…