文章目录
1. 什么是STL 2. STL六大组件 3. 标准库中string类 3.1 auto关键字 3.2 范围for 3.3 string类的类型 3.4 string类的常用接口(string类对象的常见构造) 3.5 string的析构和赋值运算符重载 3.6 string类对象的容量操作
1. 什么是STL
STL(standard template library—标准模板库):是C++标准库的重要组成部分,而且它还是一个涵盖数据结构与算法的软件框架 STL发展至今一共出现4个版本,原始版本、P.J.版本、RW版本、SGI版本,而我们主要学习第4个版本,它的命名风格和编程风格阅读性非常高
2. STL六大组件
STl六大组件的内容有点多,不过也有一些我们之前见过的Stack、Queue等,它就是集数据结构与算法的一个标准库,所有内容后期会慢慢讲,今天先来学习第一个,容器中的string类,容器说白了,就是数据结构
3. 标准库中string类
C语言标准库提供了一些str系列的库函数,用来处理字符串,但是这些库函数和字符串是分离开的,底层空间需要用户自己管理,可能还会越界访问,因此C++特别引入了string类来进一步完善字符串的操作 在讲string前,先学习2个在string类里面经常使用的auto和范围for
3.1 auto关键字
C++11之前,auto修饰的变量,是具有自动存储器的局部变量,之后C++11赋予auto全新的含义:auto不再是一个存储类型的指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导可得 简单的说,auto修饰的变量,它的类型是由操作符右边的对象推导出来的
一行声明多个变量时,这些变量的类型必须相同,否则编译器会报错,编译器只对第一个类型推导,然后用退出来的类型定义其他变量 auto不能作为函数的参数,但是可以做返回值 auto不能直接用来声明数组
上面简单介绍了auto的用法,它是根据已知对象的类型来推导新创建的对象,但是上面的场景一般不用auto,按照之前的逻辑写就没有任何问题,为何还要多此一举呢?但是有些场景下,auto用起来就比较爽
这是一个容器,可以看出dict
这个对象的类型就挺长,map就是一个容器,这个我们以后讲,这里先见识一下auto的使用场景
3.2 范围for
对于一个有范围的集合,程序员自己来说明循环的范围有点多余,还容易出错,因此C++11引入了范围for的概念,它从冒号:
开始分为两部分,冒号前面接迭代的变量,最后+迭代的范围 范围for自动迭代,自动取数据,自动判断结束 范围for可以用到数组和容器对象上的遍历 范围for的底层很简单,容器遍历就是替换为迭代器,这个我们以后会讲
范围for在遍历数组时,从起始位置开始将元素赋值给对象e,然后数组指向下个元素,再将数组下个元素赋值给元素e,以此类推,直到遍历完整个数组 如果不想让数组arr赋值给对象e,可以使用引用 范围for有三个自动:自动取对应容器(如:数组、列表等)里面的元素,自动++找下个元素,自动判断结束
for ( auto element : range) {
}
range可以是数组、列表、向量或者任何可以生成迭代器的范围
3.3 string类的类型
C++string类中引入了几个char类型,简单了解下 wchar_t是宽字节类型,大小为2个字节 char16_t为2个字节,char32_t为4个字节大小
3.4 string类的常用接口(string类对象的常见构造)
分类 功能说明 string( ) 构造空的string类对象,即空字符串 string( const char* s) 用常量字符串来构造string类对象 string(const string& s) 调用拷贝构造函数来初始化string对象 string(const string& str, size_t pos, size_t len) 从给定的string对象str的pos位置开始,拷贝构造len个字符给string新创建的对象 string (const char* s,size_t n) 用常量字符串s的n个字符构造string对象 string(size_t n, char c) 对string类的对象构造n个c字符
string类的成员函数begin( )和end( )分别返回指针指向对应字符的位置,不过这是底层的实现方法,在C++他们被封装成了一个迭代器,用来访问string类的对象
3.5 string的析构和赋值运算符重载
3.6 string类对象的容量操作
函数名 功能说明 size(重点) 返回字符串有效字符长度 length 返回字符串有效字符长度 capacity 返回总空间大小 empty(重点) 判断字符串是否为空,是就返回true,否则返回false clear(重点) 清空有效字符 reserve(重点) 为字符串预留空间,防止插入数据时空间不足 resize(重点) 将有效字符的个数改成n个,多出的用字符c填补 max_size(基本不用) 返回容器可以容纳的最大的元素个数 shrink_to_fit(慎用) 减少容器的容量以适应其当前大小,并销毁超出当前大小的所有元素
max_size也不常用,这里仅做了解,它表示容器可以容纳多大的空间,可以看出,它的数值很大,但是底层实现原理为数组,开不出那么大的连续空间