3.1 命名空间的using声明
- using声明:每个using声明引入命名空间的一个成员;头文件中的代码一般不应使用using声明(或者直接加一句 using std::std 表示引用整个命名空间的名字)。
3.2 标准库类型string
- 标准库类型string 表示可变长的字符序列。
3.2.1 定义和初始化string 对象
- string初始化:用数字和字符初始化,则string对象内容是将给定字符连续重复给定次数得到的序列。
- 直接初始化和拷贝初始化:使用等号(=) 的是拷贝初始化,它的的是直接初始化。
3.2.2 string 对象上的操作
- getline:从输入流中读入内容直到读入换行符,保留空白符,但换行符不存入string对象中。
- string::size_type:由于size返回的是一个无符号整型数,因此切记,如果在表达式中混用了带符号数和无符号数将可能产生意想不到的结果。
假设n是一个具有负值的int,则表达式 s.size()<n的判断结果几乎肯定是true。因为负值n会自动转换成一个比较大的无符号值。 - 字面值与string:字符字面值和字符串字面值可以转化为string对象,相加时加号两侧的运算对象至少有一个是string型。
3.3 标准库类型vector
- 标准库类型vector表示对象的集合,也称为容器。其中所有对象的类型都相同。集合中的每个对象都有一个与之对应的索引,索引用于访问对象。
- 实例化:根据模版创建类或函数的过程,必须指明实例化成何种类型。不存在包含引用的vector。
3.3.1 定义和初始化vector对象
- c++语言提供的初始化方式大多数情况下都是可以互相等价的使用。但也有例外:
a:使用拷贝初始化时(即使用=时)只能提供一个初始值;
b:如果提供的是一个类内初始值,则只能使用拷贝初始化或者花括号初始化;
c:如果提供的是初始元素值的列表,则只能使用花括号进行初始化列表;
例:vector<int> ivec(10) //10个元素,每个都是初始化为0
vector<int> ivec{10} //1个元素,该元素的值是10
总而言之:花括号{} 用来列表初始化,弧括号()用来指定元素个数的初始化。
3.4 迭代器介绍
迭代器是一种访问容器元素的方式或工具,功能与下标类似。
3.4.1 使用迭代器
- 迭代器成员:begin和end运算符的具体类型由对象是否是常量决定,cbegin和cend始终得到const_iterator。(一般来说,我们不清楚也不在意迭代器准确的类型到底是什么)
- 箭头运算符(->):把解引用和成员访问两个操作结合在一起。it->mem和(*it).mem表达的意思相同。
3.4.2 迭代器运算
- 迭代器算术运算:两个迭代器,指向同一容器中的元素或尾元素的下一位置,比较的是位置的前后;相减得到different_type型的有符号整数,表示两个迭代器的距离。
3.5 数组
3.5.1 定义和初始化内置数组
- 定义数组:数组是一种符合类型,必须指定数组类型,不能使用auto由初始值推断;类型不能是引用。
- 字符数组:可以使用字符串字面型初始化,数组中需要空间放空字符。
- 复杂数组声明:从数组名字开始按照由内向外的顺序阅读,如int *(&a)[10]表示a是对数组引用,该数组包含10个int*。
3.5.3 指针和数组
- 数组特性:很多用到数组的地方,编译器都会自动的将其替换为一个指向数组首元素的指针。(必须指出,当使用decltype关键字时上述转换不会发生)
- 首指针和尾后指针:使用标准库函数begin()和end()可以得到数组的首指针和尾后指针;提供这两个指针可以将数组拷贝初始化vector对象;尾后指针不指向具体元素,不能解引用或递增。
- 指针比较:只要两个指针指向同一个数组的元素或尾元素下一个位置,就能用关系运算符比较前后;两个指针相减的结果类型是有符号类型ptrdiff_t。
- 小标和指针:标准库类型限定下标必须是无符号类型,而内置的下标运算无此要求。
3.5.5 与旧代码的接口
- string转char*:s.c_str()函数将string对象s,转化为一个C风格的字符串,但无法避免s改变后之前返回的字符串失去效用
3.6 多维数组
- 多维数组初始化:使用花括号的形式,未列出的元素执行默认值初始化。
- 范围for处理多维数组:除最内层循环外,其他所有循环的控制变量都应该是引用类型,以避免这些数组形式的元素被自动转换成指向数组首元素的指针。
- 多维数组指针:多维数组的指针是指向内层数组的指针;避免指针类型混淆可使用auto或decltype,begin()和end(),类型别名简化多维数组的指针。
网友评论