C++容器之字符串的详解

news2024/11/14 7:18:20

每日诗词:

我见青山我妩媚,料青山见我应如是。

                                                          ——《贺新郎·甚矣吾衰矣》【宋】辛弃疾


目录

补漏:

vector在分配新内存块后如何进行元素复制

正文:

字符串变量和常量

字符串变量:

解析:

字符串常量:

关于字符表示的说明:

下期预告:C++码表之Unicode


补漏:

vector在分配新内存块后如何进行元素复制

在std::vector分配新的内存块以扩容后,它需要将旧内存块中的所有元素复制到新分配的内存块中。这个复制过程具体是如何进行的,取决于元素的类型和编译器/标准库的实现,但通常遵循以下原则:

1.元素类型:如果元素类型是简单类型(如int、float等),则复制过程通常是通过简单的内存拷贝操作完成的,比如使用memcpy或类似的函数。对于这些类型,不需要调用构造函数或析构函数。

2.复杂类型:如果元素类型是复杂类型(比如自定义的类或结构体),则复制过程需要更加小心。在这种情况下,元素的复制通常是通过调用元素的拷贝构造函数(或拷贝赋值运算符,具体取决于实现)来完成的。这意味着每个元素都会被单独复制,包括其所有成员变量。

3.C++11及以后:从C++11开始,移动语义被引入,这可能会影响vector扩容时的元素复制行为。如果元素类型支持移动操作(即定义了移动构造函数和移动赋值运算符),则vector可能会选择移动元素而不是复制元素,以提高效率。移动操作允许将资源(如动态分配的内存)从一个对象“转移”到另一个对象,而不是复制它们。这通常比复制更快,因为移动操作可以避免不必要的内存分配和释放。

在vector扩容时,一旦新内存块被分配,旧内存块中的所有元素就会按照上述原则被复制(或移动)到新内存块中。然后,旧内存块会被释放,以避免内存泄漏。最后,vector会更新其内部指针和容量值,以反映新的内存块和新的容量。vector扩容时内存分配的策略是什么?


正文:

字符串变量和常量
字符串变量:
  1. 字符串是以空字符('\0')结束的字符数组
  2. 空字符'\0'会自动添加到的内部表示中
  3. 在声明字符串变量时,应该为这个结束符预留一个元素的位置。
  4. 例如:char a[11]={"helloworld"};
#include<iostream>
using namespace std;
int main()
{

char a[10]={"helloworld"};

return 0;
}

 请大家判断我上面的代码是对还是错。答案是错的。

解析:

这是因为我们要在数组中预留一个位置给空字符,我们可以不用写空字符,系统会给我们自动补上,但是我们要留一个位置给空字符。

字符串常量:

字符串常量是一对双引号括起来的字符序列。

字符串中的每一个字符作为一个数组的元素来存储。(所以我们可以通过数组的下标来定位这个元素的位置,对这个元素进行一些操作)

例如字符串"helloworld";

但是这个结束符也会导致字符串出现一些bug,会导致程序错误,结果不符。这个缺陷我在往期的文章中专门说过。C语言字符串缺陷

关于字符表示的说明:
  1. char c1=0            //0x00
  2. char c2='\0'    //0x00
  3. char c3='0'     //0x30

看上面的例子,大家思考一下他们之间相同吗,为什么?

每一行的后面我写上的注释是这些变量在计算机内部的机械码表示。这个0x是十六进制的表示。

所以我们可以看到1和2是相同的,3是不同的。这就说明0和\0在计算机中(字符串数组这部分)代表的意义相同。他们之间的本质就是后面地机械码(ASCII码表)的关系上。

 大家看上面的拼图,这个就是那三个例子的机械码表示,这些是16进制表示,可以转换成十进制。所以它们三个在机械码中有着各自的含义。

ASCII码表

ASCII码表(American Standard Code for Information Interchange)是美国信息交换标准代码的缩写,它是一套电脑编码系统,主要用于显示现代英语和其他西欧语言中的字符。ASCII码表包含了128个字符,包括大小写英文字母、数字、标点符号、控制字符等,每个字符都对应着一个唯一的7位二进制数(或者说是一个介于0到127之间的十进制数)。这些字符按照一定的顺序排列在ASCII码表中,其中一些常用的字符。

如大写字母'A'到'Z'、小写字母'a'到'z'、数字'0'到'9'等,都有固定的ASCII码值与之对应。例如,大写字母'A'的ASCII码是65,小写字母'a'的ASCII码是97,数字'0'的ASCII码是48。

链接在这大家可以自行查看:ascii码对照表

但是由于计算机的普及这种由美国研制的码表就不那么通用了,下期我们会提到一个更通用的码表。


🆗到这里,这篇关于C++容器之字符串的详解就说完了,求一个免费的赞,感谢阅读。还有一部分内容放到下期。

下期预告:C++码表之Unicode

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

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

相关文章

揭露 Sapiens:未来以人为中心的视觉任务

Sapiens | Meta Meta Reality Labs 隆重推出 Sapiens&#xff0c;这是一个尖端的模型系列&#xff0c;专为四种以人为中心的基本视觉任务而设计&#xff1a;二维姿态估计、身体部位分割、深度估计和表面法线预测。 我们的 Sapiens 模型可无缝处理 1K 高分辨率推理&#xff0c…

加州大学圣地亚哥分校 沉浸式遥操作机器人系统

想象一下&#xff0c;在VR中控制游戏角色时&#xff0c;你的手部动作能够无缝转化为角色的行动。如果将这种体验应用于现实世界中的双手机器人控制&#xff0c;将带来革命性的人机交互体验。随着Apple Vision Pro的问世&#xff0c;这一设想逐渐变为现实。然而&#xff0c;将这…

Velocity模板引擎——若依代码生成器

文章目录 快速入门准备模板数据填充运行代码 基础语法简单类型的变量获取对象类型的变量获取基础语法-循环基础语法—if判断 官网 比较擅长用于邮件&#xff0c;发票&#xff0c;web内容生成、代码生成、网页静态化 模板化的东西适合使用 当然模板引擎不止这一种&#xff0c;还…

记录|C# winform——Chart控件

目录 前言一、重点关注1.1 Chart控件效果1.2 属性1.2.0 位置讲解1.2.1 Titles——标题集合TextToolTip 1.2 .2 Series——图表序列ChartTypeLegends——图例集合 二、数据传入Chart控件2.1 如何传入数据&#xff1f;2.2 如果想限定每次展现的数据量怎么办&#xff1f; 三、标注…

主机安全-网络攻击监测

目录 概述暴力破解&#xff08;SSH爆破为例&#xff09;原理规则攻击模拟告警 端口扫描原理规则攻击模拟告警 流量劫持原理规则攻击模拟告警 参考 概述 本文介绍主机网络层面上的攻击场景&#xff0c;每种攻击场景举一个例子。监测方面以字节跳动的开源HIDS elkeid举例。 针对…

【2】搭建雅特力AT32F437ZMT OpenHarmony轻量系统开发环境

本文用于阐述如何搭建AT32F437ZMT OpenHarmony轻量系统开发环境开源组织地址&#xff1a;https://gitee.com/AT32437_OpenHarmony 1.AT-START-F437雅特力官方开发板相关资料 移植基于at32f437雅特力官方开发板AT-START-F437 AT-START-F437雅特力官方开发板相关资料 2.AT32F43…

采用不高于3次的勒让德多项式拟合原函数

利用勒让德多项式进行拟合的区域是[-1,1]&#xff0c;如果不是这个区域&#xff0c;比如是[a,b]&#xff0c;利用转化到[-1,1]。 参考以下例题计算系数 C语言代码如下 //用三阶的勒让德多项式进行拟合 #include<math.h> #include<stdio.h> #include "main.c…

智能控制,高效节能。ZLG致远电子能源智慧管理解决方案

面对楼宇及建筑群能源管理与设备控制的复杂需求&#xff0c;ZLG致远电子推出了一套能源智慧管理解决方案。该方案集设备管理、任务调度和数据可视化于一体&#xff0c;不仅实现数据的实时监控与分析&#xff0c;还助力系统节能降耗。 ZLG致远电子能源智慧管理解决方案 在ZLG致…

shallowReactive 与 shallowRef

除了之前的 ref与reactive 之外&#xff0c;Vue3 还准备了另外两个API&#xff0c;也是用来对响应式数据做处理&#xff0c;那就是 shallowReactive 与 shallowRef shallowReactive 文档解释&#xff1a;reactive() 的浅层作用形式&#xff0c;只能定义对象类型的数据。和 r…

pytorh基础知识和函数的学习:图像文件的Tensor

在深度学习和计算机视觉中&#xff0c;将图像文件转换为张量&#xff08;Tensor&#xff09;是数据预处理的重要步骤。Tensor 是一种多维数组&#xff0c;在 PyTorch 中&#xff0c;用于表示和处理数据。 首先&#xff0c;创建一个3*3的图像文件&#xff0c;放大之后&#xff…

终端防火墙软件功能 | 在终端设备上启用防火墙!终端安全小课堂开讲啦

终端设备的安全性直接关系到企业的整体网络安全&#xff0c;随着网络威胁的日益复杂和多样化&#xff0c;启用并合理配置终端防火墙软件是保障终端安全不可或缺的一环。 今天&#xff0c;我们将走进终端安全小课堂&#xff0c;详细解析安企神终端安全管理软件中的防火墙功能&a…

unity Android + WebGL 浏览器打开

1.切换为WebGL平台 2.打包的时候设置 3.放入FHS 手机打开这个链接即可 注意这是在局域网内

c++11异常

一、异常介绍 1、异常作用 异常是一种处理错误的方式&#xff0c;当一个函数发现自己无法处理的错误时就可以抛出异常&#xff0c;让函数的 直接或间接的调用者处理这个错误 2、异常操作 &#xff08;1&#xff09;throw 当问题出现时&#xff0c;程序会抛出一个异常。这是…

darnet 识别检测本地视频 保存本地视频

darnet 识别检测本地视频 保存本地视频 darknet的github下载 darknet的github下载 darknet地址 将这个下载后&#xff0c;保存在catkin_ws的src目录下

C语言 ——— 柔性数组

目录 柔性数组的概念以及定义 柔性数组的特点 柔性数组的使用 柔性数组的概念以及定义 概念&#xff1a; C99中&#xff0c;结构中的最后一个元素允许是未知大小的数组&#xff0c;这就叫柔性数组成员 定义&#xff1a; struct st_type {int i;int a[0]; //柔性数组成员…

rpmbuild构建mysql-boost-5.7.42版本的rpm包

系列文章目录 rpmbuild入门 文章目录 系列文章目录前言一、准备工作1、mysql-5.7.42源码包下载2、准备mycnf配置文件3、mysqld.server配置文件准备4、检查服务器的cmake版本和gcc版本5、服务器安装依赖 二、编译构建0、rpmbuild目录树示例1、spec文件拆分解释2、源码包解压部分…

秋招力扣Hot100刷题总结——堆

1. 数组中的第K个最大元素 题目链接 题目要求&#xff1a;给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) …

使用Jupyter Notebook实现Python编程

目录 1. 安装Anaconda 2. 启动Jupyter Notebook 3. 调试Python代码: 4. 定义一个简单的python类 ​5. 在控制台运行代码,并从命令行接受参数 6. 调用其他py文件中的类 ​7. conda环境切换和迁移 1. 安装Anaconda 到Anaconda官网下载安装包:Download Anaconda Distri…

Android - lock/unlock bootloader

在执行 adb remount 时高版本经常会提示失败 此时就需要对设备的进行解锁操作。记录两个部分&#xff0c;Google解锁和展锐解锁。 目录 一、Google解锁 二、展锐解锁 三、补充跳过按键检测的方案 一、Google解锁 官网介绍的unlock方法如下&#xff1a;锁定/解锁引导加载程序…

并发编程与并发安全

持续更新中 模块序号目录链接前言介绍1前言地址2介绍地址基础知识3计算机网络地址4操作系统地址5Java基础地址6Java并发地址7Java虚拟机地址中间件8Mysql地址9Redis地址10Elasticsearch地址11RabbitMQ地址12RocketMQ地址框架13分布式系统地址14MyBatis地址15Dubbo地址16Spring地…