C++系统学习:数组
与vector的异同相同:都是存放类型相同对象的容器不同:数组的大小确定不变,不能随意向数组中增加元素
1、定义和初始化内置数组
数组中元素的个数也属于数组类型的一部分,编译的时候维度应该是已知的,也就是说,维度必须是一个常量表达式。
默认情况下,数组的元素被默认初始化。NOTE:定义数组的时候必须制定数组类型,不允许用auto数组元素应为对象,不能是引用显式初始化数组元素
可以对数组元素进行列表初始化,此时允许忽略数组的维度。当指定了维度,则维度应比列表初始值的数量多,当维度比初始化列表的数量大时,多的部分默认初始化。字符数组的特殊性
字符数组允许用字符串字面值来进行初始化,但数组的维度必须比字符串字面值大1,用来盛放添加的空字符’/0’;char a[]=”hi”;char a1[2]=”hi”; //错误,最后的空字符’/0’没地方放不允许拷贝和赋值 不能将数组的内容拷贝给其他数组作为初始值,也不能用数组为其他数组赋值int a[]={0,1,2};int b[]=a; //不允许使用一个数组初始化另一个数组 int b=a; //不允许把数组直接赋值给另一数组理解复杂的数组声明
数组本身也是对象,因此可以定义指向数组的指针和引用。1234int *ptrs[10]; //含有10个整型指针的数组int &refs[10]=a; //错误,不存在引用的数组,数组的元素必须是对象int (*Parray)[10]=&arr; //Parray指向一个含有10个整数的数组int (&arrRef)[10]=arr; //arrRef引用一个含有10个整数的数组2、访问数组元素
可以使用范围for语句或下标来访问数组元素
在使用下标的时候,通常将其定义为size_t类型。size_t类型是一种机器相关的无符号类型,它被设计得足够大以便能表示内存中任意对象的大小。在cstddef头文件中定义了size_t类型。
遍历数组所有元素,最好的方法是范围for语句。检查下标的值3、指针和数组
在很多用到数组名字的地方,编译器都会自动地将其替换为一个指向数组首元素的指针。
对数组的元素使用取地址符就能得到指向该元素的指针。
指针也是迭代器
指向数组元素的指针可以执行迭代器一样的操作。复制代码 int a[10] = { 0 }; int n = 0; for (auto &i : a) { i = n; n++; } int *p1 = a; //相当于迭代器的begin int *p2 = &a[10]; //相当于迭代器的end for (int *p3 = p1; p3 != p2; p3++) { cout << *p3 << endl; }复制代码标准库函数begin和end
上述使用a[10]的地址来表示尾后指针很容易出错,因此标准库定义了数组用的begin和end函数来得到数组的首指针和尾后指针,其在iterator头文件中。复制代码int a[10] = { 0 }; int n = 0; for (auto &i : a) { i = n; n++; } /int *p1 = a; int *p2 = &a[10];/ int *p1 = begin(a); int *p2 = end(a); for (int *p3 = p1; p3 != p2; p3++) { cout << *p3 << endl; }复制代码二者同样的效果。指针运算
给指针加上一个整数,得到的新指针仍需指向同一数组的其他元素,或者指向同一数组的尾元素的下一位置。解引用和指针运算的交互
指针加上一个整数得到的结果仍是一个指针,因此可以解引用该指针。
下标和指针对数组执行下标运算其实是对指向数组元素的指针执行下标运算。int i=a[2];//上面的下标引用其实是下面的过程int p=a;i=(p+2);
虽然标准库类型vector和string也能执行下标运算,但是数组与它们相比还是有所不同。标准库类型限定使用的下标必须是无符号类型,而内置的下标运算无此要求。int *p=&a[2];int j=p[1]; //实际是a[3]int k=p[-2]; //实际上是a[0]与旧代码的接口混用string对象和C风格字符串
C风格字符串:以空字符结尾的字符数组。
string提供一个名为c_str()的成员函数来将string转换为C风格字符串,返回的是const char*类型。使用数组初始化vector对象
指明要拷贝区域的首元素地址和尾后地址即可。int a[]={0,1,2,3,4,5};vector v(begin(a),end(a));
NOTE:不能用vector初始化数组。
尽量不使用数组和指针,而使用vector和迭代器
尽量不使用C风格字符串,而使用string
多维数组
C++语言中没有多维数组,通常所说的多维数组其实是数组的数组。
int a[3][4]; //大小为3的数组,每个元素是含有4个整数的数组
int b[10][20][30];
多维数组的初始化
使用花括号括起来的一组值初始化多维数组,和普通数组初始化一样,只是数组的元素也是数组而已。
复制代码
int a[3][4]={
{0,1,2,3},
{4,5,6,7},
{8,9,10,11}};
int a[3][4]={0,,1,2,3,4,5,6,7,8,9,10,11}; //和上面的效果一样
int a[3][4]={{0},{1},{3}}; //其余的默认初始化
复制代码
多维数组的下标引用
表达式含有的下标运算符数量和数组的维度一样多,该表达式的结果将是给定类型的元素;当比数组的 维度数量小时,表示的是内层数组。
使用范围for语句处理多维数组
复制代码
size_t cnt=0;
for(auto &row:a)
for(auto &col:row)
col=cnt;cnt++;
}
复制代码
NOTE:
使用范围for语句处理多维数组,除了最内层的循环外,其他所有循环的控制变量都应用是引用类型。为了防止编译器将auto控制变量转换成数组首元素的指针。
指针和多维数组
当程序使用多维数组的名字时,也会自动将其转换成指向数组首元素的指针。
也可以通过使用auto或decltype来遍历多维数组
复制代码
int a[3][4] = {};int cnt = 0;for (auto p = a; p != a + 3; p++){for (auto q = *p; q != *p + 4; q++){*q = cnt;cnt++;}}for (auto p = a; p != a + 3; p++){for (auto q = *p; q != *p + 4; q++){cout << *q << " | ";}cout << endl;}
复制代码
也可以使用begin和end来简化
复制代码
int a[3][4] = {};int cnt = 0;for (auto p = begin(a); p != end(a); p++){for (auto q = begin(*p); q != end(*p); q++){*q = cnt;cnt++;}}for (auto p = begin(a); p != end(a); p++){for (auto q = begin(*p); q != end(*p); q++){cout << *q << " | ";}cout << endl;}
复制代码
类型别名简化多维数组的指针
复制代码
using int_array=int[4];int a[3][4] = {};int cnt = 0;for (auto p = begin(a); p != end(a); p++){for (auto q = begin(*p); q != end(*p); q++){*q = cnt;cnt++;}}for (int_array *p = a; p != a + 3; p++){for (int *q = *p; q != *p + 4; ++q){cout << *q << " | ";}cout << endl;}
分享一些基础的数据知识,有喜欢的小伙伴可以多多关注我。想要学习的伙伴可以加qun710520381,学习编号:久伴。有不懂的问题可以来帮助你解决!
C++系统学习:数组相关推荐
- Java I/O系统学习系列二:输入和输出
编程语言的I/O类库中常使用流这个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象."流"屏蔽了实际的I/O设备中处理数据的细节. 在这个系列的第一篇 ...
- pyqt5从子目录加载qrc文件_【JVM系统学习之路】一篇看懂类加载
JVM系统学习之路系列演示代码地址:https://github.com/mtcarpenter/JavaTutorial 嗨喽,小伙伴大家好,我是小春哥,今天是打卡 [JVM系统学习之路] 的第二篇 ...
- 布谷鸟哈希函数的参数_系统学习hash算法(哈希算法)
系统学习hash算法(哈希算法) 转载请说明出处. 前言: 关于本文<系统学习hash算法>的由来.在看到了<十一.从头到尾彻底解析Hash 表算法>这篇文章之后,原文中没有暴 ...
- 零基础怎么系统学习大数据?
大数据技术是指从各种各样类型的巨量数据中,快速获得有价值信息的技术.解决大数据问题的核心是大数据技术.零基础怎么系统学习大数据?首先我们先了解一下什么是大数据. 推荐下小编的大数据学习群:251956 ...
- 区块链知识系列 - 系统学习EVM(二)-存储与安全
区块链知识系列 - 系统学习EVM(一) 特点 EVM出于所谓运算速度和效率方面考虑,采用了非主流的256bit整数. 不支持浮点数 缺乏标准库支持,例如字符串拼接.切割.查找等等都需要开发者自己实现 ...
- 如何系统学习区块链技术-干货来袭
区块链术涉及面很广,很多开发人员看了一些资料后,感觉似懂非懂. 如何系统的学习区块链技术,是很多想从事区块链开发的程序员的疑问,本文内容有点多,一次吸收不完可以收藏以后再用. 苦口婆心写在前面: 从事 ...
- 手写数字识别系统学习(1)
手写数字识别系统学习(1) 从这一章起,我们将通过手写数字识别这一非常经典的机器学习项目接着来学习神经网络 一.数据数据和测试数据 我们在上一章提到了权重和偏置的概念,这是一个相当繁琐的数据集,我 ...
- Esp8266进阶之路14 esp8266的 FreeRtos系统学习的正确姿势,环境配置环境、烧录。(附带demo)
本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...
- java后端系统学习总结 03_java Web基础学习
猿猿正在系统的学习一些计算机知识,和后端技术栈,目前阶段主要在系统学习java.此专栏,为我学习过程中的学习笔记,便于日后复习回顾来看,也很适合新人学习参考呦. 以下是猿猿对JavaWeb的第一遍学习 ...
- Shell系统学习之什么是Shell
系列文章目录 Shell系统学习之什么是Shell Shell系统学习之创建一个Shell程序 Shell系统学习之向Shell脚本传递参数 Shell系统学习之如何执行Shell程序 Shell系统 ...
最新文章
- 为什么会出现网络流量管理?
- Angular dependency injection - how injection is parsed
- 数据结构 二、向量(接口与实现and可扩容向量)
- HTML如何实现斜体字
- 常用cpu位数与变量长度表(不同编译器可能有差异)
- 记录.NET Core部署到Linux之.NET Core环境搭建(1)
- GNOME 3.20 两大新特性说明
- oozie控制台命令
- Android视频编码的坑
- BP 神经网络算法原理
- Kubernetes 调整 nodePort 端口范围
- CentOS 8 配置 authorized_keys 免密登录后,免密登录失败的排查以及最终的解决
- 平面几何----向量证明欧拉线
- Django程序的发布
- 使用CDN后网页无法访问怎么解决
- 【Rust 日报】2021-12-23 Rust有什么是Zig所没有的?
- name norm is not defined
- 没有了老师,该如何学习?
- 【游戏策划】之神仙道的计算公式
- vue里面使用axios跨域问题