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 因为迭代器没有定义互相相加的加法和除法。

扫描二维码关注公众号,回复: 2652008 查看本文章

 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;
}

     

猜你喜欢

转载自blog.csdn.net/qq_25037903/article/details/81347929