第三章 字符串、向量和数组
-
p74 使用
using
声明,可以直接访问命名空间中的名字 -
p75 一般头文件中不使用
using
,因为头文件会被多次引用,以免产生冲突#include <string> using std::string; // 如果在开头有 using namespace::std,那么后者当然就可以省略。
-
p76 使用
=
为拷贝初始化,其余为直接初始化 -
p77
getline
不包含换行符size
函数返回string::size_type
类型的值
-
p80 标准库允许把字符字面值和字符串字面值转换成
string
对象(string
可以直接相加,但字面值不行) -
p81 字符串字面值和
string
是不同的类型 -
p82 C语言的
name.h
->C++的cname
;C语言的ctype.h
->C++的cctype
-
p82 代码
// C++11新标准 string str("something"); for (auto c : str) cout << c << endl; // 想要改变,使用引用类型 for (auto &c : s) c = toupper(c); // 通过索引访问 cout << s[0] << endl;
-
p87
vector
是一个类模板而非类型,vector
容纳着其他对象 -
p88 列表初始化
// C++11新标准 vector<string> v1{"a", "an", "the"};
-
p89
()
和{}
的含义是不一样的 -
p91
vector
对象能高效增长,在运行时向其中添加具体值 -
p91 循环体内部有向
vector
对象添加元素的语句时,则不能使用范围for
循环(for
语句不能改变其所遍历序列的大小) -
p91
-
p92 访问
vector
对象中元素的方法和string
中类似 -
p92
vector
对象的类型总是包含着元素的类型vector<int>::size_type; //正确 vector::size_type; //错误
-
p95
end
成员返回称为尾后迭代器,一个本不存在的“尾元素的下一个位置” -
p96 如果容器为空,
begin
和end
返回的都是尾后迭代器 -
p96
-
p97 泛型编程:多使用
!=
而不是<
,因为标准库容器都定义了!=
和==
-
p98 C++11新标准针对
const_iterator
类型的返回值,新增了cbegin
和cend
-
p98 箭头运算符(解引用+成员访问):
it->mem
等价于(*it).mem
-
p100
difference_type
的带符号整数记录迭代器之间的距离 -
p101 数组与
vector
不同的地方是,数组的大小确定不变 -
p102 字符串字面值的结尾处还有一个空字符
-
p102 数组不允许拷贝和赋值
-
p103 理解复杂的数组声明
int *ptrs[10]; //ptrs是含有10个整型指针的数组 int &refs[10] = /* ? */; //错误:不存在引用的数组 int (*Parray)[10] = &arr; //Parray指向一个含有10个整数的数组 int (&arrRef)[10] = arr; //arrRef引用一个含有10个整数的数组
最好的办法是从数组的名字开始由内向外顺序阅读
-
p105 数组类型其实是使用一个指向该数组首元素的指针
-
p106 C++11新标准在
iterator
头文件中引入begin
和end
函数返回数组的指针 -
p107
ptrdiff_t
为两指针相减的结果类型,是一种带符号类型 -
p108 数组使用的内置的下标运算可以是负值,这与
vector
和string
不一样 -
p112 尽量使用
vector
和迭代器,避免使用内置数组和指针;尽量使用string
,而不是C风格的基于数组的字符串 -
p112 C++没有多维数组,其实是数组的数组,第一个维度为行,第二个维度为列
-
p114 要使用
for
处理多维数组,除了最内层的循环外,其他所有循环都应该是引用类型for (auto &row : ia) // row的类型为含有4个整数的数组的引用 for (auto &col : row){ col = cnt; ++cnt; }
-
p115
int *ip[4]; // 整形指针的数组 int (*ip)[4]; // 指向含有4个整数的数组