首页 > 编程语言 >C++容器之字符串的详解

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

时间:2024-08-27 09:26:27浏览次数:12  
标签:vector 码表 元素 C++ 详解 内存 字符串 ASCII

每日诗词:

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

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


目录

补漏:

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码对照表

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


标签:vector,码表,元素,C++,详解,内存,字符串,ASCII
From: https://blog.csdn.net/2301_81280642/article/details/141504037

相关文章

  • 学习C++的阶段总结
    每日诗词:盛气光引炉烟,素草寒生玉佩。应是天仙狂醉,乱把白云揉碎。                        ——《清平乐·画堂晨起》【唐】李白目录月末学习总结展望和感谢通知我的目标是:共同进步下期预告:搞定C++指针;更新时间:待定......
  • RIAD详解
    RAID(独立磁盘冗余阵列)是一种将多个物理磁盘驱动器组合成一个单元的技术,目的是提高性能、数据冗余性或两者兼有。以下是常见RAID级别的详细描述:1.RAID0(条带化)描述:RAID0将数据分散在多个磁盘上,没有冗余性。每个磁盘存储数据的一部分,这些部分组合在一起构成整个数据集。优点......
  • 【网络编程通关之路】 Udp 基础回显服务器(Java实现)及你不知道知识原理详解 ! ! !
    本篇会加入个人的所谓鱼式疯言❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言而是理解过并总结出来通俗易懂的大白话,小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.......
  • LeetCode 算法:爬楼梯 c++
    原题链接......
  • 手搓平衡搜索树-红黑树 平衡修正 图文详解 (万字长文)
    目录红黑树简述性质/规则主要规则:推导性质:红黑树的基本实现structRBTreeNodeclassRBTree红黑树的插入红黑树插入修正前言什么时候需要变色:变色的基础:为什么需要旋转与变色变色:旋转需要修正的所有情况先认识最简单的情况1.叔叔是红色结点注意:2.没有叔叔结点3.叔叔是黑色......
  • 字符串压缩算法
    目录RLE(游程长度编码)算法原理步骤说明示例说明代码示例python语言:C语言:优缺点Huffman编码基本原理构造Huffman树编码与解码过程代码示例python语言:C语言:优缺点LZW压缩字典构建与压缩过程步骤说明代码示例python语言:C语言:优缺点字符串压缩算法用于减......
  • 【C语言】详解函数
    文章目录前言一、函数的概念二、自定义函数1.函数的语法形式2.形参和实参3.return语句三、库函数1.标准库和头文件2.库函数的使用四、函数的声明和定义五、传值调用和传址调用六、嵌套调用和链式访问1.嵌套调用2.链式访问前言一、函数的概念二~三、自定义函......
  • 信息学奥赛c++语言:判断能否被3,5,7整除
    题目描述给定一个整数,判断它能否被3,5,7整除,并输出以下信息:1、能同时被3,5,7整除(直接输出357,每个数中间一个空格);2、只能被其中两个数整除(输出两个数,小的在前,大的在后。例如:35或者37或者57,中间用空格分隔);3、只能被其中一个数整除(输出这个除数);4、不能被任何数整除,输出小写字符......
  • 【C++ 面试 - 内存管理】每日 3 题(三)
    ✍个人博客:Pandaconda-CSDN博客......
  • c++学习
    心得1.字符串处理函数strcat(s1,s2)//将s2连接到s1后,并返回s1strncat(s1,s2)//只对s2的前n个字母进行操作strcpy(s1,s2)//将s2复制到s1strncpy(s1,s2)strcmp(s1,s2)//比较s1和s2的大小,若s1>s2,返回正整数;若s1=s2,返回0;若s1<s2,返回负整数;strncmp(s1,s2)strlen(s1)//......