C++ string的基本运用详细解剖

news2024/11/18 9:45:10

string的基本操作

  • 一.与C语言中字符串的区别
  • 二.标准库中的string
  • 三.string中常用接口的介绍
    • 1.string中常用的构造函数
    • 2.string类对象的容量操作函数
    • 3.string类对象的访问及遍历操作
    • 4.string类对象的修改操作
    • 5.string类的非成员函数
    • 6.string中的其他一些操作

一.与C语言中字符串的区别

C语言中的字符串是以’\0’为结束标志的字符的数组,但字符串函数与字符串是分离的,这与OOP(面向对象编程)的思想不符,所以C++提供了支持自动扩容且用类域封装的——string类

二.标准库中的string

官方文档中对string类的介绍如下:

String class
Strings are objects that represent sequences of characters.
( 字符串是表示字符序列的类)

The standard string class provides support for such objects with an interface similar to that of a standard container of bytes, but adding features specifically designed to operate with strings of single-byte characters.
( 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。)

The string class is an instantiation of the basic_string class template that uses char (i.e., bytes) as its character type, with its default char_traits and allocator types (see basic_string for more info on the template).
(string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。)

Note that this class handles bytes independently of the encoding used: If used to handle sequences of multi-byte or variable-length characters (such as UTF-8), all members of this class (such as length or size), as well as its iterators, will still operate in terms of bytes (not actual encoded characters).
(注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。)

三.string中常用接口的介绍

1.string中常用的构造函数

Alt

constructor函数功能说明
string()默认构造,构造空字符串的string类
string (const string& str) (重点)用一个string对象来构造新的string对象(拷贝构造)
string (const string& str, size_t pos, size_t len = npos)用一个string对象pos位置开始的len个字符构造,如果len太大或者len==npos就直到末尾
string (const char* s)(重点)用C-string来构造string类对象
string (const char* s, size_t n)用C-string的前n个字符构造
string (size_t n, char c)用n个c字符构造初始化
template <class InputIterator>string (InputIterator first, InputIterator last)(重点)用一段迭代器区间构造

测试用例:

int main()
{
	string s1;
	string s2("hello world");
	string s3(s2);
	string s4("hello world", 5);
	string s5(5, 'x');

	cout << "s1:" << s1 << endl;
	cout << "s2:" << s2 << endl;
	cout << "s3:" << s3 << endl;
	cout << "s4:" << s4 << endl;
	cout << "s5:" << s5 << endl;

	return 0;
}

运行结果:

s1:
s2:hello world
s3:hello world
s4:hello
s5:xxxxx

2.string类对象的容量操作函数

函数名称功能说明
size返回字符串有效字符(不包括’\0‘)的长度(重点)
length返回字符串有效字符(不包括’\0‘)的长度(同size)
capacity返回空间总大小
empty判断是否为空串,如果是返回true,不是返回false
clear(重点)清除有效字符
reserve(重点)预留空间(扩容)
resize(重点)== 将有效字符个数变为n个,多出的空间用字符c填充==

注意:
1.size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一 致,一般情况下基本都是用size()。
2. clear()只是将string中有效字符清空,不改变底层空间大小。
3. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字 符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的 元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
4. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于 string的底层空间总大小时,reserver不会改变容量大小。

测试用例:

int main()
{
	string s1("hello world");
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;

	s1.resize(20,'x');
	cout << s1.size() << endl;
	cout << s1 << endl;
	s1.reserve(100);
	cout << s1.capacity() << endl;

	cout << s1.empty() << endl;
	s1.clear();
	cout << s1.empty() << endl;
	return 0;
}

运行结果:

11
15
20
hello worldxxxxxxxxx
111
0
1

3.string类对象的访问及遍历操作

函数名称功能说明
operator[]返回pos位置的字符
begin+endbegin返回第一个位置的迭代器,end返回最后一个字符的下一个位置的迭代器
rbegin+rend返回反向迭代器,这样可以支持从后往前遍历
范围forC++11支持更加简洁的范围for遍历

测试用例:

int main()
{
	string s1("hello world");

	//1.operator[]遍历
	for (int i = 0; i < s1.size(); ++i)
	{
		cout << s1[i] << " ";
	}
	cout << endl;

	//2.迭代器遍历
	string::iterator it = s1.begin();
	while (it != s1.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;

	//3.反向迭代器
	string::reverse_iterator rit = s1.rbegin();
	while (rit != s1.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	cout << endl;

	//4.范围for
	for (auto& e : s1)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

运行结果:

h e l l o w o r l d
h e l l o w o r l d
d l r o w o l l e h
h e l l o w o r l d

4.string类对象的修改操作

函数名称功能说明
push_back在字符串后尾插一个字符
append在字符串后追加一个字符串
operator+=(重点)在字符串末尾追加一个字符串
c_str返回C语言格式的字符串
find从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置,找不到返回npos
rfindrfind 从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置,找不到返回npos
substr在str中从pos位置开始,截取n个字符,然后将其返回

注意:
1. 在string尾部追加字符时,s.push_back© / s.append(1, c) / s += 'c’三种的实现方式差不多,一般 情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。
2. 对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留好。

代码演示:

int main()
{
	string s1("hello world");

	s1.push_back('x');
	s1.append("yyyyyy");
	s1 += 'z';
	s1 += "+++++++++++";

	cout << s1<<endl;
	return 0;
}

运行结果:

hello worldxyyyyyyz+++++++++++

5.string类的非成员函数

函数名称功能说明
operator+尽量少用,传值返回效率低
operator>>流插入运算符重载
operator<<流提取运算符重载
getline(重点)获取一行字符串
relational operators(重点)各种大小比较

这些操作比较好理解,这里就不演示代码了,如果需要就去文档中看看测试用例:
链接: link

6.string中的其他一些操作

函数名称功能说明
shrink_to_fit将容量和大小适配
assign为字符串分配一个新值,替换其当前内容。
replace将字符串中从字符 pos 开始并跨越 len 字符的部分(或 [i1,i2) 之间范围内的字符串部分)替换为新内容
find_first_of在字符串中搜索与其参数中指定的任何字符匹配的第一个字符。
find_last_of在字符串中搜索与参数中指定的任何字符匹配的最后一个字符。
find_first_not_of在字符串中搜索与其参数中指定的任何字符不匹配的第一个字符。
find_last_not_of在字符串中搜索与参数中指定的任何字符不匹配的最后一个字符。
copy将字符串对象当前值的子字符串复制到 s 指向的数组中。此子字符串包含从位置 pos 开始的 len 字符。该函数不会在复制内容的末尾附加 '\0’字符。

关于string类的使用就这么多,感谢您的观看!!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网页WebRTC电话和软电话哪个好用?

关于WebRTC电话与软件电话哪个更好用&#xff0c;这实际上取决于多个因素&#xff0c;并没有一个绝对的答案。不过&#xff0c;我可以根据WebRTC技术的一些特点&#xff0c;以及与传统软件电话相比的优劣势&#xff0c;为你提供一个清晰的对比。 首先&#xff0c;让我们了解一下…

python画图|放大和缩小图像

在较多的画图场景中&#xff0c;需要对图像进行局部放大&#xff0c;掌握相关方法非常有用&#xff0c;因此我们很有必要一起学习 【1】官网教程 首先是进入官网教程&#xff0c;找到学习资料&#xff1a; https://matplotlib.org/stable/gallery/subplots_axes_and_figures…

uniapp在线打包的ios后调用摄像头失败的解决方法

uniapp在线打包的ios后调用摄像头失败的解决方法 解决方法&#xff1a; 由于未选中打包模块的配置 当你在测试时发现能够正常的开启摄像头&#xff0c;但是当你对其进行在线打包后&#xff0c;发现当你点击启用摄像头时&#xff0c;没有反应&#xff0c;或者是打开是黑屏状态…

STM32F103C8----3-1 LED闪烁(跟着江科大学STM32)

一&#xff0c;电路图 接线图 面包板的的使用请参考&#xff1a;《面包板的使用_面包板的详细使用方法-CSDN博客》 二&#xff0c;目的/效果 2.1 推婉输出 外部供电&#xff08;熄的时间长&#xff09; 2.2 推婉输出 内部供电(亮的时间长) 三&#xff0c;创建Keil项目 详…

无人机之集群控制及应用

一、无人机集群控制 无人机集群控制是指通过先进的通信、导航和控制算法&#xff0c;实现多架无人机之间的协同、协调和高效的任务执行。其关键技术包括&#xff1a; 通信技术&#xff1a;实现无人机之间的实时数据传输和共享&#xff0c;确保集群控制的准确性和稳定性。 路径…

RabbitMQ 高级特性——TTL

文章目录 前言TTL设置消息的 TTL设置队列的 TTL 前言 对于前面讲到的重试机制中&#xff0c;当确认策略为 MANUAL 手动确认的时候&#xff0c;如果消费者出现了程序逻辑错误&#xff0c;那么消息就无法被争取处理&#xff0c;那么就会执行 basicNack 方法&#xff0c;如果我们…

黑马头条day7-app端文章搜索

今天的内容也只是跑了一下 对于具体的实现掌握的很差 仔细看 es 在微服务学的es使用基本忘光了 这里用起来一点都熟悉 重学&#xff01;&#xff01;&#xff01; kafka异步 文章自动构建索引的时候用到了‘’ mongoDB 用来存储用户的搜索记录 遗忘&#xff08;拦截器 j…

【有啥问啥】In-Context Learning(上下文学习):深入解析与应用实践

In-Context Learning&#xff08;上下文学习&#xff09;&#xff1a;深入解析与应用实践 引言 在人工智能与机器学习的浪潮中&#xff0c;In-Context Learning&#xff08;上下文学习&#xff09;作为一种新兴的学习范式&#xff0c;正逐渐崭露头角。与传统的机器学习模型不…

第四届机器人、自动化与智能控制国际会议(ICRAIC 2024)征稿

第四届机器人、自动化与智能控制国际会议&#xff08;ICRAIC 2024&#xff09;由湖南第一师范学院主办&#xff0c;南京师范大学、山东女子学院、爱迩思出版社&#xff08;ELSP&#xff09;协办。 大会将专注于机器人、数字化、自动化、人工智能等技术的开发和融合&#xff0c…

Go实现RabbitMQ 死信队列、优化

死信队列是什么&#xff1f; 如何配置死信队列&#xff1f; go实现死信队列 go使用发布订阅模式改造批量发送消息 【教学内容】 1. 死信队列是什么&#xff1f; 注意&#xff1a;业务队列与死信交换机的绑定是在构建业务队列时&#xff0c;通过参数&#xff08;x-dead-le…

计算机网络基础--认识协议

目录 前言 一、IP地址与端口 二、网络协议 1.网络体系结构框架 2.网络字节序 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 计算机网络涉及非常广泛&#xff0c;这篇文章主要对计算机网络有个认识 提示&#xff1a;以下是本篇文章正文内容&#x…

SNMP和Syslog有啥区别

在网络管理的世界中&#xff0c;SNMP&#xff08;简单网络管理协议&#xff09;和 Syslog&#xff08;系统日志&#xff09;是两种关键技术&#xff0c;它们分别在监控和管理网络设备方面发挥着重要作用。选择合适的工具对于确保网络的高效运行、优化性能和增强安全性至关重要。…

【易上手快捷开发新框架技术】nicegui组件button用法庖丁解牛深度解读源代码IDE运行和调试通过截图为证

传奇开心果微博文系列 前言一、button 组件基本用法1. 最基本用法示例2. 创建带图标按钮 二、button按钮组件样式定制1. 按钮的尺寸调整2. 改变颜色示例3. 按钮的自定义字体大小4. 圆角形状示例5. 自定义边框6. 添加阴影7. 复合按钮8. 浮动按钮9. 可扩展浮动操作按钮QFAB10. 按…

OpenCV视频I/O(14)创建和写入视频文件的类:VideoWriter介绍

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 视频写入器类。 该类提供了用于写入视频文件或图像序列的 C API。 cv::VideoWriter 类是 OpenCV 库中用于创建和写入视频文件的一个类。它提供了…

echarts实现3D柱状图(视觉层面)根据博主改编

https://blog.csdn.net/weixin_57798646/article/details/131067725 这是原贴 在这个基础上我需要实现 一根柱子 代码如下 <!DOCTYPE html> <html lang"en" style"height: 100%"><head><meta charset"utf8"> </hea…

【中间件学习】Nginx快速入门(为了配置一个项目)

-----------------------------本文章借鉴遇见狂神说--------------------------- 一、一个产品出现瓶颈&#xff1f;&#xff1f; 在一个产品刚刚上线的时候&#xff0c;并发量小&#xff0c;用户使用的少&#xff0c;所以在低并发的情况下&#xff0c;一个jar包启动应该就够…

Anaconda虚拟环境默认路径在C盘怎么更改

笔者已经新建好了虚拟环境并且安装了对应库&#xff0c;输入conda env list查询发现虚拟环境竟然安装到了C盘(&#xff61;•́︿•̀&#xff61;)&#xff0c;为避免下一次创建虚拟环境出错&#xff0c;笔者现在修改默认路径置D盘&#xff08;软件安装盘&#xff09; 参考两…

SSH连接Vscode

1.安装扩展包ssh 2-1.获取ssh登录命令 输入连接命令 2-2.获取虚拟机秘钥给vscode 查看远程主机的信息 打开工作目录 打开远程终端 3.RSA免密登录 打开power shell输入命令,获取秘钥 添加公钥到虚拟机 名字会自动更新&#xff0c;下一次进入虚拟机就不需要输入密码了

使用apipost工具导入通过swag生成的golang接口文档步骤

1.通过swag init 生成docs接口文档 见使用swag init --parseDependency生成api文档报错解决办法 2.导入操作 ok,操作完成

数据结构双链表和循环链表

目录 一、循环链表二、双向链表三、循环双向链表 一、循环链表 循环链表就是首尾相接的的链表&#xff0c;就是尾节点的指针域指向头节点使整个链表形成一个循环&#xff0c;这就弥补了以前单链表无法在后面某个节点找到前面的节点&#xff0c;可以从任意一个节点找到目标节点…