仿函数、算法(查找、归并、分类)、迭代器(iterator)、空间配置器(allocator和内存池先(只申请空间但是并没有初始化,避免频繁从堆中申请内存影响效率))、容器(string、vector)、配接器
c语言的字符串不能很好的按需进行修改,比如因为字符串一般存储在字符数组当中,而字符数组的大小是定死的,如果要对字符数组里面的内容进行调整可能会受限,所以有了string这个类型,但是其底层管理的依旧还是字符数组,支持增删查改。
stirng也是类模板typedef过来的:typedef basic_string<char> string
basic_string<T>:这个类模板发展了许多的类,来应对不同的需要。如下:typedef basic_string<wchar_t> wstring
typedef basic_string<char32_t> u32string
typedef basic_string<char16_t> u16string
一个汉字可以看成ASCII码表上的一个字符,但只用一个字节表示汉字,由于状态只有256种太少不适用->unicode(万国):UTF-8(一个字节为单位,可以用1个字节或者2个、3个、4个字节来编码,对不同范围的字符是同不同长度的编码。比如常见的汉字采用2个字节,生僻的汉字采用4个字节)、UTF-16、UTF-32(更加的统一但是也更加的浪费)。
int main() {char str1[] = "apple";char str2[] = "高手";cout << sizeof(str1) << endl;//6cout << sizeof(str2) << endl;//5,看下面的监视我么们可以发现每一个汉字需要两个字符表示,而每个字符都是负数,这是因为ASCII码用了正数的部分,导致如果想要兼容ASCII的话那么汉字编码的部分只能使用负数部分,如果和ascii码混用的话,会有问题,我们拿到两个字符,到底是对应着一个汉字,还是两个ASCII符号。现在我们可以拿到一个字符,看第一个bit位的数值,如果是0对应着ASCII码,如果是1就和下面一个字符联合对应一个汉字。return 0; }
int main() {char str2[] = "高手";str2[3]--;cout << str2 << endl;str2[3]--;cout << str2 << endl;str2[3]--;cout << str2 << endl;str2[3]--;cout << str2 << endl;str2[3]--;cout << str2 << endl;str2[3]--;cout << str2 << endl;return 0; }
由上可知,gbk编码是将同音字编码到一块的。
int main() {string s1;//无参构造string()string s2("hello world");//string (const string& str)string s3 = "hello world";//单参数构造函数可以直接赋值,因为支持隐式类型转换:构造+拷贝=>构造string s4(s3, 6, 3);//string (const string& str, size_t pos, size_t len = npos)从下标pos位置开始拷贝npos长度cout << s4 << endl;string s5(s3, 6, 13);//npos超过s5的末尾时,停止拷贝cout << s5 << endl;string s6(s3, 6);//static const size_t npos = -1;相当于将32bit的1赋值给一个无符号整形,解读成42亿多cout << s6 << endl;string s7("hello world", 5); //string(const char* s, size_t n)拷贝字符串s的前n个位置的值cout << s7 << endl;string s8(10, '*');//string (size_t n, char c)字符串填充n个字符ccout << s8 << endl;for (size_t i = 0; i < s2.size(); ++i){s2[i]++;//[]运算符重载}cout << s2 << endl;for (size_t i = 0; i < s2.size(); ++i){cout << s2[i] << " ";}cout << endl;return 0; }
int main()
{string s1("hello world");cout << s1.size() << endl;cout << s1.length() << endl;//length和size的结果是一样的,功能一样,size()之所以出现是为了和stl库的其它结构保持一致cout << s1.max_size() << endl;//意义不大cout << s1.capacity() << endl;//capacity是不包含'/0'的,但实际上是开了'