string的介绍
详细介绍stringAPI
1、 字符串是表示字符序列的类
2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作
单字节字符字符串的设计特性。
3. string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信
息,请参阅basic_string)。
4. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits
和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。
5. 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个
类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。
总结:
- string是表示字符串的字符串类
- 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
- string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>
string; - 不能操作多字节或者变长字符的序列。
在使用string类时,必须包含#include头文件以及using namespace std;
// 编码 - 值--符号建立映射关系 -- 编码表
// ascii编码表 -- 表示英文编码表
// unicode -- 表示全世界文字编码表 utf-8 utf-16 utf-32
// gbk -- 中文自己量身定做都编码表
//
// typedef basic_string<char> string;
int main()
{
//string s1("hello");
char str1[] = "hello";
cout << str1 << endl;
char str2[] = "吃饭";
str2[1] += 1;
str2[3] += 1;
str2[1] += 1;
str2[3] += 1;
str2[1] += 1;
str2[3] += 1;
cout << sizeof(char) << endl;
cout << sizeof(wchar_t) << endl;
return 0;
}
用的是Unicode编码,中文汉字占两个字节,我们修改汉字前缀的字节看看变化,吃饭 -> 痴泛 -> 持坊 -> 匙芳 ,同音字的变化。如果想要对Uniocde编码进行正确的修改,我们应该使用wstring,
std::wstring主要用于 UTF-16编码的字符,而std::string主要用于存储单字节的字符( ASCII字符集 ),但是也可以用来保存UTF-8编码的字符。(UTF-8和UTF-16是UNICODE字符集的两种不同的字符编码)如果你的程序支持多种语言,那么使用UTF-16来处理字符会方便一些,因为该编码中的每个字符都占用2个字节;而UTF-8中的字符所占的字节可能是1个字节或者多个字节(范围是1 ~ 6 个字节),多字节的字符编码对于处理字符不方便,而且std::string也没有提供对UTF-8的支持。
例:
下面的代码中定义了两个字符串对象,都包含了5个字符:
int main()
{
string text1 = "你好,朋友";
wstring text2 = L"你好,朋友";
cout << text1.length() << endl;//10
cout << text2.length() << endl;//5
}
由于std::string对UTF-8支持不完善所以输出的结果10并不正确:
上面的程序要输出正确的结果需要使用特殊的UTF-8字符编码API来实现,所以对于UNICODE字符使用std::string来实现字符操作比较麻烦。
转载链接