数组基础

来源:互联网 发布:金山新城成交数据 编辑:程序博客网 时间:2024/06/05 21:32

1.数组与vector

 数组vector容器大小必须固定自由添加性能对于某些应用起来性能较好对于某些应用起来性能较差引用对象元素不允许存放引用对象元素不允许存放引用对象定义和初始化默认初始化,有元素默认初始化,为空没有元素 列表初始化列表初始化 指定数量初始化,同默认初始化,无法指定初始化值指定数量和值初始化,访问元素下标:range for下标:range for 迭代器指针   


2.内置数组的定义和初始化

基础定义和默认初始化

  • 是一种复合类型,因为要借助其他对象的类型,与[ ] 拼凑而成
    • a[d] 表示数组名字为a,维度/容量为d, 
    • 维度在编译的时候就已经定了
    • 维度不能在程序运行时被改动--->d 必须是一个常量或者常量表达式
  • 默认初始化
    •  数组在定义的时候就会被初始化:int arr[10]
  •  内置类型的说明
    • 内置类型就是那些C++已经自带的类型:int char float 等 
    • 推广到标准库的类型:string, vector等  
  •  auto关键字在数组中
    • 定义数组必须是明确的对象类型 
    • 不允许使用auto来定义或者初始化数组  :auto a[10]
    • 数组对象无法存放引用对象 int &a[10]

数组显示初始化

  •  列表初始化
    • 可以忽略数组的维度,int a[] = {0,1,2,3}
    • 编译器会根据列表初始值的数量来推断出来
  •   需要注意指明了维度的列表初始化
    • 如果指明了维度,在列表初始化中数量不能超过维度的大小
    • 如果列表初始化中数量小于维度,剩下的被初始化为默认值
  •   需要注意标准C++对于数组拷贝和赋值支持
    • 不允许拷贝初始化
      • int a[] = {1,2,3}
      • int a2[] = a;   error
    • 不允许“=”赋值
      • a2 = a;    error    

字符数组

  •    需要注意字符数组一定要结尾处有一个空字符
  • 字符数组的初始化
    • 列表初始化
      • char a1[] ={'C','+','+'}    
    • 字符串初始化
      • char a2[] = "C++"      //含有4字符,最后面有一个空字符

复杂复合类型数组的申明   

  •  指针数组
    • 其表述有一定的问题,可以理解为指针的数组,
      • 用来存放指针的数组 
    • 定义的格式 int *ptrs[10]
    • 具体理解
      • 从右往左来分析:首先是大小为10的数组,
      • 然后名字是ptrs,数组元素的类型是int类型的指针
      • ptrs是一个含有10个整形的指针数组  
  • 数组指针
    • 可以理解为数组的指针,其实是一个指针,但是这个指针指向的是数组
    • 定义格式:int (*parray)[10]
    • 具体理解
      •  数组最好是由内向外来理解,首先是圆括号里面是一个指针,
      • 右边是是指向大小为10的数组指针,
      • 左边是可知数组的元素类型是int,
      • parray是一个指向含有10个整数的数组
  • 引用数组,理解为存放引用的数组,这个不允许的
    • 引用没有具体的内存,不是对象
    • int &refs[1]    
  • 数组引用,数组的引用,主要是定义引用,其类型是一个数组
    • int (&refarray)[10]
      • 数组最好是由内向外来理解,首先是圆括号里面是一个引用,
      • 右边是大小引用对象时一个大小为10的数组,
      • 左边是可知数组的元素类型是int
      • rarr是一个引用含有10个整数的数组    




实例练习:
  1. 实例数组的定义,尤其是维度常量的使用,auto和引用的错误使用
  2. 数组列表初始化的实例,注意维度和列表范围之间的关系,拷贝和赋值的错误使用
  3. 字符数组类型
  4. 复杂数组类型的实例 

  1. int a[10];
  2. string sa[10];
  3. void main()
  4. {
  5. #pragma region 实例数组的定义,尤其是维度常量的使用,auto和引用的错误使用
  6. //迭代器begin和end是两个关键的位置元素
  7. //尤其end并不是最后一个元素,而是最后一个元素后面的一个位置,并不是元素
  8. unsigned int d = 10;
  9. //int arr[d];//err 指定数组大小的时候必须是一个常量
  10. const unsigned cd = 10;
  11. int arr2[cd];
  12. int arr3[10];
  13. string sa1[cd];
  14. //默认初始化数组的值
  15. for (auto i : arr2)
  16. {
  17. cout << i << " ";
  18. }
  19. cout << endl;
  20. for (auto i : sa1)
  21. {
  22. cout << i << " ";
  23. }
  24. cout << endl;
  25. //全局变量数组的默认初始化
  26. for (auto i : a)
  27. {
  28. cout << i << " ";//初始化为0
  29. }
  30. cout << endl;
  31. for (auto i : sa)
  32. {
  33. cout << i << " ";
  34. }
  35. cout << endl;
  36. #pragma endregion
  37. #pragma region 数组列表初始化的实例
  38. int barr[3] = { 1, 2, 3 };
  39. int barr2[] = { 1, 2, 3 };
  40. int barr3[5] = { 1, 2, 3 };//多出来的数组会被默认初始化为0
  41. //int barr4[2] = { 1, 2, 3 };//err 列表初始化的时候必须要在数组大小范围内
  42. for (auto i : barr3)
  43. {
  44. cout << i << " ";
  45. }
  46. cout << endl;
  47. //int barr4[] = barr;//err 数组不允许拷贝或者赋值
  48. //int barr5[] = { 1, 2, 3 };
  49. //barr5 = barr2;
  50. #pragma endregion
  51. #pragma region 字符数组类型
  52. //一定要注意其后面必须有一个/0作为结束符
  53. char carr1[] = "Wall.E";
  54. for (auto i : carr1)
  55. {
  56. cout << i << " ";
  57. }
  58. cout << endl;
  59. //char carr1[6] = "Wall.E";//err 大小不匹配,记得结束符
  60. #pragma endregion
  61. #pragma region 复杂数组类型的实例
  62. int darr[10];
  63. int *ptrInt[10];//是一个数组,数组存放10个int类型的指针
  64. //int &refInt[10];//err 数组无法存放引用类型
  65. int(*pArry)[10] = &darr;//是一个指针,指向的是大小为10的int类型数组
  66. int(&refArry)[10] = darr;//是一个引用,引用的是大小为10的int类型数组
  67. #pragma endregion
  68. system("pause");
  69. return;
  70. }


3.访问数组元素


  • 数组下标
    • 下标的类型:size_t 是一个无符号类型
    • 可以使用 range for来访问数组
  • 使用下标需要注意的地方
    • 要判断其是否在数组范围内,不要越界
 
 实例练习:
  1. 使用数组来统计分数
  2. 数组下表的类型的实例

  1. #pragma region 使用数组来统计分数
  2. int grade[11] = {};
  3. int score;
  4. int index = 0;
  5. while (cin >> score)
  6. {
  7. if (score<=100)
  8. {
  9. ++grade[score / 10];
  10. index++;
  11. }
  12. if (index >10)
  13. {
  14. break;
  15. }
  16. }
  17. for (auto i: grade)
  18. {
  19. cout << i << endl;
  20. }
  21. #pragma endregion
  22. #pragma region 访问数组,注意下标的范围
  23. const size_t arrary_size = 10;
  24. int ia[arrary_size];
  25. //这里注意数组的范围是是从0开始的,如果大小10的数组,其范围是0-9
  26. for (size_t i = 0; i < arrary_size; i++)
  27. {
  28. ia[i] = i;
  29. cout << i << endl;
  30. }
  31. int ia2[arrary_size];
  32. for (size_t i = 0; i < arrary_size; i++)
  33. {
  34. ia2[i] = ia[i];
  35. cout << ia2[i] << endl;
  36. }
  37. vector<int> v1{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  38. vector<int> v2(v1);//使用vector进行拷贝的是时候是可以直接赋值初始化的
  39. #pragma endregion


1 0
原创粉丝点击