命名空间
字符串
初始化的几种方式
- 对于一般的内建类型,这两种初始化基本上没有区别。
- 当用于类类型对象时,初始化的复制形式和直接形式有所不同:直接初始化直接调用与实参匹配的构造函数,复制初始化总是调用复制构造函数。复制初始化首先使用指定构造函数创建一个临时对象,然后使用复制构造函数将那个临时对象复制到正在创建的对象。
常用操作
字符串读取
在执行读取时(cin),string对象会自动忽略开头的空白(即空格符、换行符、制表符等),并从第一个真正的字符开始读取,直到遇到下一处空白为止
而 getline 从给定的输入流中读入内容,知道遇到换行符为止。只要一遇到换行符就结束读取并返回结果,哪怕一开始就是换行符也是如此,此时返回空 string
字面值和string对象相加
必须确保每个加法运算符的两侧运算对象至少有一个是string:
为了与 C 兼容,所以 C++ 中的字符串字面值并不是标准库类型 string 对象。
基于范围的 for 语句
如果需要访问对象中的没一个元素,使用范围 for 语句会非常简洁。
vector
vector 是模板而非类型,容纳着其它对象,所以常常被称作容器。
初始化
二维数组
添加元素
c++ 标准要求 vector 在运行时可以高效快速的添加元素,因此在定义 vector 对象时设定其大小也就没什么必要了。
迭代器
我们知道可以使用下标运算符来访问 string 和 vector 中的元素,c++ 中有一种更加通用的机制来达到相同的目的,迭代器。
如果容器为空,则 begin 和 end 返回的是同一迭代器,都是尾后迭代器。
迭代器支持的运算
c++ 程序员都习惯性使用 != ,因为所有标准库容器的迭代器都定义了 == 和 !=,但是它们中的大多数都没有定义 < 运算符
迭代器类型
如果对象只需读而不需要写操作的话最好使用常量类型, cbegin 和 cend
数组
与 vector 不同的是数组的大小确定不变,不能随意像数组中增加元素。
字符数组
字符串字面值是一串常量字符,字符串字面值常量用双引号括起来的零个或多个字符表示,为兼容C语言,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符。
复杂数组声明
理解数组声明最好的方式就是从数组的名字开始由内向外的顺序阅读。
多维数组
使用范围 for 语句处理多维数组,除了最内层的循环外,其它所有循环的控制变量都应该是引用类型。因为编译器会将数组形式的元素转换成指向该数组内首元素的指针,这样 row 的类型就是 int* 了,内层循环就不合法了。