第三章字符串、向量和数组
梗概:本章先是提到了命名空间的使用,之后重点介绍STL里的vector和string两个部分。后面又讲解了迭代器的概念以及更底层的数组及多维数组的概念。
3.1命名空间的using声明
使用别的文件中的变量或者函数需要预先声明,或者是使用::来表示。每次都加很麻烦,可以在文件开头使用using namespace::name;语句来声明一个变量或者函数。例如using std:cin;
头文件中尽量不适用using声明。
3.2标准库类型string
#include<string>
using std:string;
3.2.1定义和初始化string对象
加了以上两个语句之后可以直接使用string的操作。
使用等于号是拷贝初始化,直接用括号是直接初始化。
string s1; string s2 = s1; string s2(s1); string s3 = "hiya"; string s4(10, 'c');
3.2.2 string对象上的操作
string可以直接使用iostream读写,使用getline读取一行。
cout读取string时忽略开头空白,之后到遇到空白停止。
getline读取到换行符,不保存换行符。
size() 返回string::size_type类型,无符号整数。
字面值与string对象可以直接相加返回string对象。
os << s; is >>s; getline(is, s); s.empty(); s.size(); s[n]; s1+s2; s1 = s2; s1 == s2; s1 != s2; <, <= , > , >=。
练习3.3 string的输入运算符跳过开头空白,之后遇到空白停止。 getline读取空白作为string对象的内容直到遇到换行符。
3.2.3 处理string对象中的字符
cctype头文件中有处理字符的函数。
范围for语句: for (declaration : expression) statement;
循环时改变string对象中的字符需要声明为引用,如for(auto & c: s) c= toupper(c);
下标运算符可以直接取string对象中的字符,返回的是引用类型。注意下标越界。类型是string::size_type。
练习3.6
for (auto & x : s)
x = 'X';
练习3.7 s不变
练习3.9 不合法 s是空串 下标越界
练习3.10 合法 const char &
3.3 标准库类型vector
vector是类模板,使用需要提供对象类名。
vector是对象的容器,因此不存在引用的vector。
3.3.1 定义和初始化vector对象
普通初始化与string类似。
列表初始化vector<string> articles = { "a", "an", "the"},此时不能用圆括号。
创建指定数量的元素 vector<int> ivec(10, -1)。
列表初始化与指定元素数量:花括号优先列表初始化,如类型不符考虑为指定数量。圆括号指定数量。
练习3.12 (a) T (b) 错误,类型不一致 (c) 正确
3.3.2 向vector对象中添加元素
v.push_back()函数从最后添加元素进v。
vector可以高效增长,无需预先设定长度。
添加元素时不能使用范围for循环。
3.3.3 其它vector操作
和string类似。
只有当vector内部的对象可比较时,vector对象才可以比较。
vector索引与string类似。不能直接使用下标添加对象,数组下标越界。
练习3.19 vector<int> v(10,42); vector<int> v = {42,42,...,42}; push_back