欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

c++ primer 笔记第三章字符串、向量和数组(二)

程序员文章站 2024-03-21 14:45:10
...

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

     

 

相关标签: C primer