探索 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.hqwc.cn/news/66595.html

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

相关文章

EasyPoi导出 导入(带校验)简单示例 EasyExcel

官方文档 : http://doc.wupaas.com/docs/easypoi pom的引入: <!-- easyPoi--><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.0.0</version></dep…

Grounding DINO:根据文字提示检测任意目标

文章目录 1. 背景介绍2. 方法创新2.1 Feature Extraction and Enhancer2.2 Language-Guided Query Selection2.3 Cross-Modality Decoder2.4 Sub-Sentence Level Text Feature2.5 Loss Function3. 实验结果3.1 Zero-Shot Transfer of Grounding DINO3.2 Referring Object Detec…

远程运维大批量IT设备?向日葵批量部署、分组授权与安全功能解析

数字化转型的不断推进&#xff0c;给予了企业全方位的赋能&#xff0c;但任何发展都伴随着成本与代价&#xff0c;比如在数字化转型过程中企业内部办公与外部业务所需的不断增加的IT设备数量&#xff0c;就为日常的运维工作提出了更大的挑战。 针对企业面对海量IT设备时的运维…

NAS搭建指南一——服务器的选择与搭建

一、服务器的选择 有自己的本地的公网 IP 的请跳过此篇文章按需求选择一个云服务器&#xff0c;目的就是为了进行 frp 的搭建&#xff0c;完成内网穿透我选择的是腾讯云服务器&#xff0c;我的配置如下&#xff0c;仅供参考&#xff1a; 4. 腾讯云服务器官网地址 二、服务器…

Nginx负载均衡以及keepalived高可用实验

Vip 10.1.122 Keepalived-master 10.1.1.132Keepalied-backup 10.1.1.133Realserver_1 10.1.1.136Realserver_2 10.1.1.137 四台机器上安装nginx&#xff0c;编译安装的话需要另外安装pcre包支持&#xff0c;安装在/usr/local/nginx Keepalived-master 和backu…

多维时序 | MATLAB实现ZOA-CNN-BiGRU-Attention多变量时间序列预测

多维时序 | MATLAB实现ZOA-CNN-BiGRU-Attention多变量时间序列预测 目录 多维时序 | MATLAB实现ZOA-CNN-BiGRU-Attention多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.Matlab基于ZOA-CNN-BiGRU-Attention斑马优化卷积双向门控循环单元网络…

软件测试用例设计方法之因果图法

基本概念 因果图是一种利用图解法分析输入的各种组合情况&#xff0c;从而设计测试用例的方法&#xff0c;它适合于检查程序输入条件的各种组合情况。 设计测试用例的步骤 分析软件规格说明描述中, 哪些是原因(即输入条件或输入条件的等价类),哪些是结果(即输出条件), 并给每…

微服务04-elasticsearch

1、es概念 1.1 文档和字段 elasticsearch是面向**文档(Document)**存储的,可以是数据库中的一条商品数据,一个订单信息。文档数据会被序列化为json格式后存储在elasticsearch中: 而Json文档中往往包含很多的字段(Field),类似于数据库中的列。 1.2 索引和映射 索引(…

【go语言学习笔记】05 Go 语言实战

文章目录 一、 RESTful API 服务1. RESTful API 定义1.1 HTTP Method1.2 RESTful API 规范 2. RESTful API 风格示例3. RESTful JSON API4. Gin 框架4.1 导入 Gin 框架4.2 使用 Gin 框架4.2.1 获取特定的用户&#xff08;GET&#xff09;4.2.2 新增一个用户&#xff08;POST&am…

手机app测试

一、安装、卸载、更新、运行 1.安装、卸载 应用是否可以正常安装&#xff08;命令行安装&#xff1b;apk&#xff0f;ipa安装包安装&#xff09;&#xff08;有网&#xff0c;无网是否都正常&#xff09;卸载过程中出现死机&#xff0c;断电&#xff0c;重启等意外的情况&…

加载并绘制时间域内的心电图信号,并实施Q因子为1的陷波滤波器以去除50 Hz频率研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

「量化」快乐:UC Berkeley 利用 AI 追踪多巴胺释放量及释放脑区

内容一览&#xff1a;多巴胺是神经系统中重要的神经递质&#xff0c;与运动、记忆和奖赏系统息息相关&#xff0c;它是快乐的信使&#xff0c;当我们看到令人愉悦的东西时&#xff0c;体内就会分泌多巴胺&#xff0c;诱导我们向它追寻。然而&#xff0c;多巴胺的准确定量分析目…