CD34.【C++ Dev】STL库的string的使用 (上)

目录

1.知识回顾

2.串联类和对象的知识重新理解

构造函数

string();

string (const string& str);

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

string (const char* s);

string (size_t n, char c);

append和push_back

string& append (const string& str); 

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

string& append (const char* s); 

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

template string& append (InputIterator first, InputIterator last);

operator+=

operator[ ]

理解[ ]本质是解引用

上方代码能否访问到\0?

方法1:下条件断点后监视

方法2:反汇编后看内存,手动查找

方法3:直接监视窗口看封装好的string类的str

缺点


1.知识回顾

之前在C++ Contest专栏提到过string的使用

CC12.【C++ Cont】string类字符串的创建、输入、访问和size函数

CC13.【C++ Cont】初识string类字符串的迭代器

CC14.【C++ Cont】string类字符串的push_back、pop_back、字符串+=与+运算和insert

CC15.【C++ Cont】string类字符串的find和substr函数

CC16.【C++ Cont】string类字符串的关系运算和与string有关的函数

2.串联类和对象的知识重新理解

上方提到的文章讲的比较浅,只是介绍了怎么用,本文将用类和对象的思想来理解

以https://legacy.cplusplus.com/reference/string/string/?kw=string网为线索:

构造函数

 下面只讲常用的

string();

无参数传递,即默认构造,也称无参构造

string (const string& str);

传参的类型为const string,为拷贝构造

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

传参的类型为const string,为拷贝构造,只不过是拷贝构造str的子串,显然第3个参数是缺省参数,如果不写,默认从pos位置一直截取的string风格的字符串的结尾

string (const char* s);

const char*为C语言风格的字符串类型,因此为使用C风格的字符串构造

string (size_t n, char c);

使用n个字符c来构造

append和push_back

https://legacy.cplusplus.com/reference/string/string/append/

append v.追加 即向原string类字符串后追加字符串,作用类似push_back,只不过push_back只能追加字符

有关push_back成员函数的简单使用参见CC14.【C++ Cont】string类字符串的push_back、pop_back、字符串+=与+运算和insert文章

此外:如果string的空间不够,append或push_back会自动扩容,(具体的扩容策略和编译器的处理有关,没有统一的规定),C语言strcat,不能自动扩容且找\0耗时

string& append (const string& str); 

向原string类字符串后追加string类字符串(类似push_back)

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

向原string类字符串后追加string类字符串str的子字符串

string& append (const char* s); 

向原string类字符串后追加C语言风格的字符串

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

向原string类字符串后追加C语言风格的字符串的前n个字符

代码示例:

#include <iostream>
#include <string>
using namespace std;
int main()
{string str("teststring");str.append("abcdef", 3);cout << str << endl;return 0;
}

运行结果:

template <class InputIterator>
   string& append (InputIterator first, InputIterator last);

 向原string类字符串后追加范围为[first,last)的一串字符

代码示例:

#include <iostream>
#include <string>
using namespace std;
int main()
{string str1("teststring");string str2("000abc111");str1.append(str2.begin()+3,str2.begin()+6);cout << str1 << endl;return 0;
}

运行结果:

operator+=

参见CC14.【C++ Cont】string类字符串的push_back、pop_back、字符串+=与+运算和insert文章

operator[ ]

https://legacy.cplusplus.com/reference/string/string/operator[]/

给了两种重载形式,一个可以修改字符串,一个不能修改字符串

可做如下测试:

#include <iostream>
#include <string>
using namespace std;
int main()
{string str1("helloworld");const string str2("teststring");str1[1];str2[1];return 0;
}

写法等价为:使用点操作符调用成员函数

str1.operator[](1);
str2.operator[](2);

从地址上看,调用operator[]的地址不同,因此是不同的重载函数:

如果从operator[]函数的定义上来看:

str1[1]的operator[]没有有const修饰:

str2[1]的operator[]有const修饰:

理解[ ]本质是解引用

代码示例:可以像数组一样访问

#include <iostream>
#include <string>
using namespace std;
int main()
{string str("helloworld");for (size_t i = 0; i < str.size(); i++)cout << str[i];return 0;
}

运行结果:

上方代码能否访问到\0?
方法1:下条件断点后监视

监视窗口查看:

str[i]解引用后是最后一个字母d,不是\0

方法2:反汇编后看内存,手动查找

Debug+x86环境下,for循环的反汇编代码:

发现ebp-3Ch和ebp-30h高频出现,由mov dword ptr [ebp-3Ch],0 猜测这是为变量i赋初值,因此[ebp-3Ch]存的是i的值, 由cmp dword ptr [ebp-3Ch],eaxjae 00540BDD猜测这是i < str.size()的条件判断,因此猜测eax临时存储的是str.size的值,可以看看寄存器:

0x0000000A=十进制的10,不带\0的helloworld恰好占10个字节,因此不会访问到\0

方法3:直接监视窗口看封装好的string类的str

备注:如果想强制打印\0可以将i < str.size()改成i <= str.size()

循环后再打印一个#检测\0有没有占位:

#include <iostream>
#include <string>
using namespace std;
int main()
{string str("helloworld");for (size_t i = 0; i <= str.size(); i++)cout << str[i];cout << "#";return 0;
}

Visual Studio 2022查看控制台窗口:

发现\0不显示,且不占位,因为VS认为str[i]超出界限,因此没有为\0占位

Dev C++查看控制台窗口:

发现\0不显示,且占位

Ubuntu Linux g++运行结果:

发现\0不显示,且不占位

发现不同平台的处理方法不同

缺点

Operator[ ]只有连续的空间才能使用,即非线性结构不能使用[ ]访问,但一些线性结构和非线性结构都可以使用迭代器访问,例如链表:

#include <iostream>
#include <string>
#include <list>
using namespace std;
int main()
{ list<int> ls;ls.push_back(1);ls.push_back(3);ls.push_back(13);ls.push_back(0);ls.push_back(43);ls.push_back(546);ls.push_back(9);for (auto i = ls.begin(); i != ls.end(); i++){cout << *i << "-->";}cout << "NULL";return 0;
}

运行结果:

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

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

相关文章

Git常用指令速查

Git常用指令速查 基本操作类&#xff1a; git init &#xff1a;初始化仓库git log&#xff1a;查看日志&#xff0c;这个命令很重要&#xff01;git add <文件名|.>&#xff1a;添加到暂存区git commit -m 注释&#xff1a;提交到仓库git merge <分支名>&#xf…

探索无人机模拟环境的多元景象及AI拓展

无人驾驶飞行器&#xff08;UAVs&#xff09;在各行各业的迅速普及&#xff0c;从农业和检测到空中操作和人机交互等令人兴奋的前沿领域&#xff0c;都引发了一个关键需求&#xff1a;强大而逼真的模拟环境。直接在物理硬件上测试尖端算法存在固有的风险——成本高昂的坠机、中…

AI Agent开源技术栈

构建和编排Agent的框架 如果您是从头开始构建&#xff0c;请从这里开始。这些工具可以帮助您构建Agent的逻辑——做什么、何时做以及如何处理工具。您可以将其视为将原始语言模型转化为更自主的模型的核心大脑。 2. 计算机和浏览器的使用 一旦你的Agent能够规划&#xff0c…

jspm老年体检信息管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 信息化时代&#xff0c;各行各业都以网络为基础飞速发展&#xff0c;而医疗服务行业的发展却进展缓慢&#xff0c;传统的医疗服务行业已经逐渐不满足民众的需求&#xff0c;有些还在以线下预约的方式接待病人&#xff0c;特别是针对于老年体检的服务&#xff0c;是少之又…

ESP32- 开发笔记- 软件开发 4 - GPIO 口

1 背景介绍 GPIO&#xff08;General Purpose Input/Output&#xff09; ——通用输入输出口&#xff0c;就是能由软件自由控制输入&#xff08;接收外界信号&#xff09;或输出&#xff08;发出电平信号&#xff09;的引脚。 ESP32 最核心的功能之一&#xff0c;能被用来控制…

格式工厂:多媒体转换工具

格式工厂&#xff08;FormatFactory&#xff09;是一款免费且功能全面的多媒体格式转换工具&#xff0c;支持视频、音频、图片及文档等多种格式的转换&#xff0c;覆盖超过70种语言&#xff0c;并兼容Windows XP至Win10/11系统。软件基于FFmpeg解码库开发&#xff0c;支持高效转…

在Anolis OS 8上部署Elasticsearch 7.16.1与JDK 11的完整指南

目录 1. 环境与版本选择 1.1 操作系统选择:Anolis OS 8 1.2 版本匹配说明 1.3 前置条件检查 2. JDK 11安装与配置 2.1 安装流程 2.2 配置详解 3. Elasticsearch 7.16.1安装与优化 3.1 基础安装 3.2 目录规划与权限 3.3 核心配置文件详解 3.4 JVM调优 4. 用户权限管…

Java中final关键字的作用?

在Java中&#xff0c;final 关键字用于表示不可变性&#xff0c;具体作用取决于它修饰的目标&#xff08;变量、方法或类&#xff09;。以下是其核心作用&#xff1a; 1. 修饰变量&#xff08;常量&#xff09; 基本类型变量&#xff1a;值不可更改&#xff08;常量&#xff09…

自动伴随无人机说明文档

自动伴随无人机说明文档 一、无人机参数二、能力说明三、操作流程3.1 模式定义3.2 启动流程3.3 可调参数&#xff08;建议默认&#xff09; 四、特别注意五、最后 一、无人机参数 型号&#xff1a;S400视觉pro版轴距&#xff1a;400mm起飞重量&#xff1a;1300g额外载重&#…

53.[前端开发-JS实战框架应用]Day04-Bootstrap入门到项目实战

Bootstrap入门到实战 1 认识Bootstrap 认识Bootstrap Bootstrap起源和历史 Bootstrap3-5版本的区别 Bootstrap优缺点 学习Bootstrap的理由 2 Bootstrap安装 Bootstrap4的安装 方式一 : CDN <!DOCTYPE html> <html lang"en"> <head><meta cha…

C#:创建变量和类的实例

在 C# 编程中&#xff0c;类作为引用类型&#xff0c;创建其变量和实例涉及到内存分配等重要概念。以下为你详细介绍创建类实例的步骤和相关操作。 类的声明与变量声明 类的声明就像是创建类实例的蓝图。当我们声明一个类后&#xff0c;就能够创建该类的实例。类属于引用类型…

<el-date-picker 设置记录时间早于当前时间 (包含时分秒)

<el-date-picker 设置记录时间早于当前时间 &#xff08;包含时分秒&#xff09; <el-date-pickerv-else-if"item.type datetime"v-model"state.ruleForm[item.key]"type"datetime":placeholder"item.title"format"YYYY-M…

Tailwind CSS 响应式设计解析(含示例)

本文内容&#xff1a; Tailwindcss V4 中如何使用响应式设计功能&#xff0c;包括默认断点、自定义断点、断点范围控制以及容器查询的各种技巧&#xff0c;帮助你在不离开 HTML 的前提下优雅构建响应式页面。 &#x1f31f; 默认断点用法&#xff08;移动优先&#xff09; Tail…

生态修复项目管理软件

在“双碳”目标与生态文明建设的双重驱动下&#xff0c;生态修复项目正成为全球环境治理的核心战场。然而&#xff0c;矿山复绿、湿地修复、水土保持等工程往往面临跨地域、多主体、长周期的管理难题——从数据分散到进度失控&#xff0c;从成本超支到风险频发&#xff0c;传统…

基于PyTorch的图像分类特征提取与模型训练文档

概述 本代码实现了一个基于PyTorch的图像特征提取与分类模型训练流程。核心功能包括&#xff1a; 使用预训练ResNet18模型进行图像特征提取 将提取的特征保存为标准化格式 基于提取的特征训练分类模型 代码结构详解 1. 库导入 import torch import torch.nn as nn import…

写一个 Java 程序,用于将字符串中的指定子串替换为另一个子串

以下是一个 Java 程序&#xff0c;它可以将字符串中的指定子串替换为另一个子串。 public class SubstringReplacement {public static String replaceSubstring(String original, String oldSubstring, String newSubstring) {return original.replace(oldSubstring, newSubs…

Docker 容器双网卡访问物理雷达网络教程

作者&#xff1a; 陈梓洋 环境&#xff1a; ubuntu 22.04lts 时间&#xff1a; 2025年4月29日 Docker 容器双网卡访问物理雷达网络教程 这个教程适用于这样的场景&#xff1a;容器保留原有 ROS 通信网络&#xff08;如 bridge 网络&#xff09;&#xff0c;同时需要访问一个物…

AWS创建多块盘并创建RAID0以及后增加空间

创建硬盘并挂载到EC2上,后查询如下 [rootip-127-0-0-1 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS nvme0n1 259:0 0 40G 0 disk ├─nvme0n1p1 259:1 0 40G 0 part / ├─nvme0n1p127 259:2 0 1M 0 part └─nvme0n1p128 259:3 …

数据结构---单链表的增删查改

前言&#xff1a; 经过了几个月的漫长岁月&#xff0c;回头时年迈的小编发现&#xff0c;数据结构的内容还没有写博客&#xff0c;于是小编赶紧停下手头的活动&#xff0c;补上博客以洗清身上的罪孽 目录 前言 概念&#xff1a; 单链表的结构 我们设定一个哨兵位头节点给链…

XSS靶场实战(工作wuwuwu)

knoxss knoxss Single Reflection Using QUERY of URL ——01 测试标签 <script>alert(666666)</script>——02: " <h1>test</h1>没有反应&#xff0c;查看源码 现在需要闭合双引号&#xff0c;我计划还是先搞标签 "><h1>tes…