c++ primer 笔记第三章字符串、向量和数组(二)
3.4 迭代器介绍
迭代器提供对容器类对象的间接访问。string不属于容易类型但支持类似操作。
3.4.1 使用迭代器
begin成员指向容器第一个元素,end指向最后一个元素后一个位置,称为尾后迭代器。
迭代器运算:*iter; iter->mem; ++iter; --iter; iter1 == iter2; iter1 != iter2;
所有迭代器都支持 == 与 != 。
迭代器概念,迭代器类型, 迭代器对象。
cbegin与cend。常量迭代器。
改变容器容量的操作可能会使迭代器失效。
3.4.2 迭代器运算
iter+n; iter-n; iter += n; iter -= n; iter1-iter2; >,>=,<,<=;
迭代器相减返回类型 difference_type,带符号整数。
练习3.26 因为迭代器没有定义互相相加的加法和除法。
3.5 数组
3.5.1 定义和初始化内置数组
定义时确定维数,维数为常量或常量表达式。
默认情况下默认初始化。
定义数组时不允许使用auto推断。
列表初始化 int a3[5] = {0, 1, 2};
字符数组初始化时为'\0'预留位置,const char a4[6] = "Daniel";错误。
不能拷贝和赋值。
int (*Parray)[10] = &arr; Parray指向一个含有10个整数的数组。
练习3.27 (a) 非法 (b) 合法 (c) 合法?无参数函数返回值看成常量。(d) 非法
练习3.28 "" 0 "" 未定义
练习3.29 不能赋值,不能变化容量,定义麻烦。
3.5.2 访问数组元素
数组下标类型 size_t,无符号整型。
遍历使用范围for循环。注意下标越界。
练习3.30 数组下标越界,范围0-9。
3.5.3 指针和数组
数组名可看成常量指针。
auto推断容易把数组类型推断成指针,decltype不会。
auto ia2(ia) 与 auto ia2(&ia[0])相同。
指针也是种迭代器。标准函数begin与end。
指针运算与迭代器相同,相减得到ptrdiff_t类型,带符号型。
ia[2] 与 *(ia+2)相同。
练习3.34 p1=p2; 当p1是常量指针时非法。
3.5.4 C风格字符串
c标准库cstring 库函数: strlen strcmp strcat strcpy 。参数必须时以空字符结尾的字符串。
大小自定,危险避免使用。
练习3.37 输出h e l l o 中间换行。 错误停止。
练习3.38 两个地址相加得到未知地址,因此非法无意义。
3.5.5 与旧代码的接口
可以使用c风格字符串赋值string对象, string对象的c_str()返回c风格字符串。但不稳定,需拷贝。
可以使用数组初始化vector,如vector<int> ivec(begin(int_arr), end(int_arr));
尽量使用标准库而非数组。
3.6 多维数组
多维数组就是数组的数组。
多维数组可以用列表初始化。
多维数组下标a[i][j] 等同 *(*(a+i)+j)。
使用范围for遍历多维数组,外层循环使用auto& 引用类型防止被推断为指针。
类型别名: using int_array = int[4]; typedef int int_array[4];
练习3.43,3.44,3.45
#include <iostream>
#include <string>
#include <cctype>
#include <vector>
#include <cstring>
typedef int int_array[4];
using namespace std;
int main()
{
int ia[3][4] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++)
cout << ia[i][j] << " ";
cout << endl;
}
for (const int(&x)[4] : ia){
for (int y : x)
cout << y << " ";
cout << endl;
}
for (int(* p)[4] = begin(ia); p < end(ia); p++) {
for (int* q = begin(*p); q < end(*p); q++)
cout << *q << " ";
cout << endl;
}
for (int_array*p = ia; p < ia + 3; p++) {
for (int *q = *p; q < *p + 4; q++)
cout << *q << " ";
cout << endl;
}
for (auto& x : ia) {
for (auto y : x)
cout << y << " ";
cout << endl;
}
return 0;
}
上一篇: 22. 括号生成
推荐阅读
-
c++ primer 笔记第三章字符串、向量和数组(二)
-
c++ primer 笔记第二章变量和基本类型(二)
-
c++ primer(第五版)学习笔记及习题答案代码版(第三章)字符串、向量和数组
-
[C++ Primer Plus]学习笔记--关于C++ string和c类型字符数组的对比
-
c++学习笔记-----字符数组和字符串常量
-
C++ Primer练习笔记-第三章 字符串、向量和数组
-
c++ primer(第五版)学习笔记及习题答案代码版(第三章)字符串、向量和数组
-
C++ Primer练习笔记-第三章 字符串、向量和数组
-
第三章C++:字符串string、向量vector和数组
-
c++学习笔记-----字符数组和字符串常量