3.1 命名空间的 using 声明
- 使用 using 声明:使用命名空间中的成员。
- 头文件不应包含 using 声明:头文件的内容会拷贝到引用它的文件中去,可能产生名字冲突。
3.2 标准库类型 string
- 初始化 string 对象
- 使用等号,拷贝初始化;不使用等号,直接初始化。
- string 操作
- 读取 string
string s1,s2;
cin >> s1 >> s2; // 输入" Hwllo World!",会忽略前后空白
cout << s1; // "Hello"
cout << s2; // "World!"
- 读取未知数量 string 对象
string s;
while (cin >> s) {
cout << s << endl;
}
- 读取一整行
while (getline(cin, s)) { //直到换行
cout << s << endl;
}
string.size()
返回size_type
类型,是无符号数。string
加法
加法运算符左右两侧至少有一个是string
,另一个可以是字符串字面值。处理
string
中的字符在名为
cname
的头文件中,定义的名字从属于命名空间std
,定义在名为.h
的头文件中则不然。
3.3 标准库类型 vector
3.4 迭代器介绍
begin
成员负责返回指向第一个元素的迭代器,end
成员负责返回指向容器尾元素的下一位置。标准容器迭代器的运算符
- 迭代器类型:
iterator
或者const_iterator
- 如果对象是常量:
begin
和end
返回const_iterator
;如果对象不是常量:begin
和end
返回iterator
;cbegin
和cend
始终返回const_iterator
- 解引用迭代器:
(*it).men
,括号不可少;相当于it->men
- 任何一种可能改变
vetcor
对象容量的操作,比如push_back
,都会使迭代器失效。 迭代器运算
- 两个迭代器相减,类型是
difference_type
,可正可负。 - 迭代器的二分查找
auto begin = text.begin(), end = text.end();
auto mid = text.begin() + (end - begin) / 2;
while (mid != end && *mid != sought) {
if (sought < *mid) end = mid;
else begin = mid + 1;
mid = begin + (end - begin) / 2;
}
3.5 数组
- 数组与向量区别:数组大小固定,向量大小可变。
- 数组维度必须是一个常量表达式。
- 字符数组初始化,可以用字符串字面值初始化,结尾处有一个空字符。
- 数组的声明(由内到外)
int *ptrs[10]; // ptrs 是含有 10 个整型指针的数组
int (*Parry)[10] = &arr; // Patty 指向一个含有 10 个整型的数组
int (&arrRef)[10] = arr; // arrRef 引用一个含有 10 个整型的数组
int *(&array)[10] = ptrs; // array 是数组的引用,该数组含有 10 个指针
- 数组名字等价于指向首元素的指针
string *p = nums; // 等价于 p = &nums[0]
p++; // p 指向 nums[1]
- 标准库函数 begin 和 end,指向数组首元素的指针,尾元素下一位置的指针。
int a[] = {0,1,2,3};
int *p = begin(a);
int *q = end(a);
while (p != q) p++;
- 指针运算
int a[] = {0,1,2,3};
int *p = a;
int *p1 = p + 1;
int q = *(a + 1);
cout << *p << *p1 << q;
- 对数组执行下标操作实际上是对指向数组元素的指针执行下标操作,内置的下标运算符可以处理负值。
int a[] = {0,1,2,3};
int *p = a + 2;
cout << p[-1];
C 风格字符串函数
定义在库cstring
头文件中,数组必须空字符结尾。- 允许使用以空字符为结尾的字符数组来初始化
string
或为string
赋值,允许string
加法运算中一个对象是以空字符为结尾的字符数组。
char ch[] = {'C','+','+','\0'};
string a = "123";
string b = a + ch;
string c{ch};
- 使用数组初始化向量
int a[] ={1,2,3};
vector<int> ivec{begin(a), end(a)};
vector<int> ivec2{a, a + 2};
3.6 多维数组
- 初始化每个元素
int a[2][3] = {
{0,1,2};
{3,4,5};
};
int b[2][3] = {0,1,2,3,4,5};
- 初始化每行首元素
int a[2][3] = {{1},{2}}; // 不可去掉里面花括号
- 多维数组的下标引用
表达式的下标运算符数量等于数组维度:元素;
表达式的下标运算符数量少于数组维度:内层数组;
int (&row)[4] = a[1]; // 将 row 绑定到 a 的第二个 4 元素数组上
- 使用
for
处理多维数组,除了最里层的循环外,其他循环的控制变量都需要是引用。
for (auto &row : a)
for (auto &col : row) // 正确
for (auto row : a)
for (auto &col : row) // 错误,row 变为指针类型
- 遍历
for (auto p = begin(a); p != end(a); p++)
for (auto q = begin(*p); q != end(*p); q++)
cout<<*q;