【深入STL:C++容器与算法】深度解析string类的使用

打印 上一主题 下一主题

主题 825|帖子 825|积分 2475


1️⃣什么是string

关于string的先容,标准文档是这样说的:
   

  • 字符串是表示字符序列的类
  • 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操纵单字节字符字符串的设计特性。
  • string类是使用char(即作为它的字符范例,使用它的默认char_traits和分配器范例(关于模板的更多信息,请参阅basic_string)
  • string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)
  • 留意,这个类独立于所使用的编码来处置处罚字节:假如用来处置处罚多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍旧按照字节(而不是实际编码的字符)来操纵
  实际上string就是动态增长的char字符数组
但string其实是一个typedef之后的类模板:如下图
string实际上是一个 模板,参数是char范例
同样,有一些少见的其他string
如wstring里面存的就是wchar_t (宽字符,应用于unicode编码)

u16string:里面存的是char16_t

u32string:里面存的是char32_t

所以string其实就是basic_string类的针对char 的实例化
string的设计以及编码问题

这里就涉及编码的问题了。盘算机中数据只有0和1,而如何表示各种文字呢,就要用到编码了。
常见的编码表有ASCII,GBK,utf-8,utf-16,utf-32等。而编码表实际就是内存中的值 和 文字符号的映射关系,例如,字符a对应内存的值就是97
string是一个字符串,而字符串表示的是信息,所以就涉及到各种文字。我们知道ASCII码是针对于老美的,因为英美的文字只包含字母和标点符号,而一个char为8位,对于二进制可以表示256钟状态,每一个字母和标点对应一个状态对于老美绝对够用了。
但是当盘算机推广的时间,其他国家的问题就不可以只依赖ASCII来编码了,比如中文的就远比英美文字复杂得多,而且中国汉字多得多,所以一个字符根本表示不完。所以中文采用多个字符的编码。常见的是两个字符即16位(65536)个状态。所以为了支持泛型编程,把string设置为一个模板,对于不同范例的字符都可以使用!
例如:
  1. char str[]="你好";
复制代码
此时str的长度就是4个字符,两个字符表示一个汉字
而每一个字符又对应一个编码

  1. -60 和 -29组合起来映射的是 你
  2. -70 和 -61组合起来映射的是 好
  3. //字符的编码值 对应编码表去查找
复制代码
反过来验证:
  1. char hello[] = { -60,-29,-70,-61,0 };
  2. cout << hello << endl;
复制代码

假如让hello[3]的元素++
  1. char str[] = "你好";
  2. hello[3]++;
  3. cout << hello << endl;
  4. hello[3]++;
  5. cout << hello << endl;
  6. hello[3]++;
  7. cout << hello << endl;
复制代码
输出结果:

发现,好的周围都是hao
关于汉字的编码,可以推得:中文编码是把同音字放在一起的
平时我们打游戏的时间,一些出口即国粹的脏话输出机玩家发的消息就会变成***,而中国文化博大精深,很多谐音字也可以用来发挥作用,所以就使用汉字的编码分区,把同音字也放到一个国粹词库中了,一旦检测到是词库中的内容,就会和携成***这就是净网行动的原理。
2️⃣string的重要接口

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

愛在花開的季節

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表