字符串,向量和数组
标准库类型 string
直接拷贝和拷贝初始化
如果使用等号(=)初始化一个变量,实际上执行的是拷贝初始化,编译器把等号右侧的初始值拷贝到新创建的对象中去。如果不使用等号,则执行的是直接初始化
string s = (10,'c') //直接初始化
string s = string(10,'c') //拷贝初始化
string 对象上的操作
s.size() 返回的是一个string::size_type类型的无符号数,当使用这个值之后就不要使用有符号数了,混用 int 和 unsigned 可能带来问题
比较 string 对象 ,大小写敏感
字面值和 string 对象相加
当把 string 对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符(+)的两侧的运算对象至少有一个是 string
处理 string 对象中的字符
处理每个字符?使用基于范围的for语句
标准库类型 vector
要想使用 vector ,必须包含适当的头文件 #include <vector>
编译器根据模板创建类或函数的过程称为 实例化
vector 能容纳绝大多数类型的对象作为元素,但是因为引用不是对象,所以不存在包含引用的vector
定义和初始化 vector 对象
如果使用的圆括号,可以说提供的值是用来构造 vector 对象的
如果使用的花括号,可以表达成我们想列表初始化该 vector 对象
向 vector 对象中添加元素
范围 for 语句体内不应改变其所遍历序列的大小
其他 vector 操作
迭代器
使用迭代器
有迭代器的类型同时拥有返回迭代器的成员,比如,这些类型都拥有名为 begin 和 end 的成员
begin 成员负责指向第一个元素的迭代器,end 成员负责返回指向容器“尾元素的下一个位置的迭代器”,该迭代器指示的是容器的一个本不存在的“尾后”元素,这样的迭代器没什么实际含义,仅是个标记
如果容器为空,则 begin 和 end 返回的都是尾后迭代器,同一个迭代器
拥有迭代器的标注库类型使用 iterator 和 const_iterator 来表示迭代器的类型
begin 和 end 运算符
如果对象是常量,就返回const_iterator,否则,返回 iterator
迭代器运算
数组
用字符串字面值初始化字符串数组时,字符串结尾处的空字符也会拷贝进去
a1维度是3,a2 a3的维度都是4,a4需要7个维度才能存放字面值“Daniel”
不允许拷贝和赋值
不能将数组的内容拷贝给其他数组作为初始值,也不能用数组为其他数组赋值
由内向外理解,*Parray 意味着Parray是个指针,然后观察右边,可知道Parray是个指向大小为10的数组的指针,最后观察左边,知道数组中的元素是 int
访问数组元素
在使用数组下标的时候,通常将其定义为 size_t 类型,是一种机器相关的无符号类型
指针和数组
string *p = &nums[0] //p 指向 nums 的第一个元素
string *p2 = nums //等价于 p2 = &nums[0]
指针也是迭代器
标准库函数 begin 和 end
指向数组的指针可以执行迭代器运算,这些运算,包括解引用,递增,比较,与整数相加,两个指针相减等,用在指针和用在迭代器上意义完全一致
使用数组初始化 vector 对象
多维数组
当程序使用多维数组的名字时,会自动将其转换成指向数组首元素的指针