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设置为一个模板,对于不同范例的字符都可以使用!
例如:
此时str的长度就是4个字符,两个字符表示一个汉字
而每一个字符又对应一个编码
- -60 和 -29组合起来映射的是 你
- -70 和 -61组合起来映射的是 好
- //字符的编码值 对应编码表去查找
复制代码 反过来验证:
- char hello[] = { -60,-29,-70,-61,0 };
- cout << hello << endl;
复制代码
假如让hello[3]的元素++
- char str[] = "你好";
- hello[3]++;
- cout << hello << endl;
- hello[3]++;
- cout << hello << endl;
- hello[3]++;
- cout << hello << endl;
复制代码 输出结果:
发现,好的周围都是hao
关于汉字的编码,可以推得:中文编码是把同音字放在一起的
平时我们打游戏的时间,一些出口即国粹的脏话输出机玩家发的消息就会变成***,而中国文化博大精深,很多谐音字也可以用来发挥作用,所以就使用汉字的编码分区,把同音字也放到一个国粹词库中了,一旦检测到是词库中的内容,就会和携成***这就是净网行动的原理。
2️⃣string的重要接口 |