C++抽象编程——数组(1)——基本用法

数组

当我们第一次介绍Vector类时,我们在在数组方面描述了向量。C ++提供了一个内置的数组类型,它基于C ++从C继承的语言模型。由于Vector集合类的统一性更加灵活和方便,所以在新代码中使用数组的原因很少。(在现有应用程序中尽管你一定会遇到矩阵)
在C ++中,数组是具有两个特征的单个数据值的低级集合:

  • 一个数组是要被排序的。必须能够按顺序排列阵列的各个组件:这里是第一个,这里是第二个,依此类推。
  • 数组是同类型的。存储在数组中的每个值必须是相同的类型。 因此,你可以定义一个整数数组或一组浮点数,而不是两种类型混合的数组。

然而,鉴于您已经熟悉Vector类,可能最简单的方法是将数组视为vector构想的原始实现。与vector一样,数组由通过整数下标选择的某些基本类型的单个元素组成。所以升级版的vector肯定也适用于阵列只是语法有一些小的区别,但是很容易掌握。真正的区别在于数组具有以下限制,使得它们在实践中比较强大的vector类型不太有用

  • 数组被分配为一个固定的大小,不能随后再更改。
  • 即使数组具有固定的大小,C++也没有使程序员可以使用该大小来编程。 因此,使用数组的程序通常需要一个额外的变量来跟踪元素的数量。
  • 数组不支持插入和删除元素。
  • C ++不执行边界检查,所以你要确保你选择的元素实际上存在于数组中。

尽管有这些明显的缺点,数组是构建更强大的集合类的框架。 要理解这些类的实现,你需要熟悉数组的机制。

数组的声明

像C ++中的任何其他变量一样,数组必须在使用之前声明。 数组声明的一般形式是:

type name[size];

其中type是数组中每个元素的类型,name是数组变量的名称,size是一个整数值,表示分配给数组的元素数。 例如,声明:

int intArray[10];

声明一个名为intArray的数组,其中包含10个元素,每个元素的类型为int。但是,在大多数情况下,你应该将大小指定为符号常量而不是显式的整数,以使数组大小更容易更改。 因此,更传统的声明将如下所示:

const int N_ELEMENTS = 10;
int intArray[N_ELEMENTS];

可以如下表示该声明:

与向量中的元素一样,数组的索引号始终以0开始,并运行到数组大小减1。 因此,在具有10个元素的数组中,索引号为0,1,2,3,4,5,6,7,8和9。

数组选择

要引用数组中的特定元素,你可以指定数组名称和与数组中该元素的位置相对应的下标。识别数组中特定元素的过程称为选择(The process of identifying a particular element within an array is called selection),并通过写入数组的名称并以与方括号中的索引相对应的方式在C ++中指示,就像从vector中选择一个元素一样:
选择表达式的结果是左值,这意味着你可以为其分配新值。 例如,如果执行for循环:

for (int i = 0; i < N_ELEMENTS; i++) {
    intArray[i] = 10 * i;
}

变量intArray将被初始化如下:

当你从数组中选择一个元素时,C ++不执行边界检查。如果索引超出范围,C ++就会明确指出该元素在内存中的位置,并使用该值,从而导致不可预知的结果。 更糟糕的是,如果为该索引位置分配值,则可以覆盖程序其他部分使用的内存内容。超出数组结尾的改写是黑客攻击计算机系统的主要漏洞之一。

数组的静态初始化

数组变量在声明时可以被赋予初始值。 在这种情况下,指定初始值的等号后跟一个包含在花括号中的初始化器列表。 例如,声明:

const int DIGITS[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

声明一个名为DIGITS的常量数组,其中10个元素中的每一个被初始化为自己的索引号。 从这个例子可以看出,系统允许你从声明中省略数组大小,然后自动计算数组大小。
在DIGITS示例中,你知道列表中有10位数字。 然而,在许多情况下,程序将需要确定静态初始化数组中的元素数量,以免程序员每次更改程序时都必须对元素的数量进行计数。例如,假设你正在编写一个程序,需要一个包含所有美国城市名称的数组,人口超过1,000,000。 采用2010年人口普查数据,你可以使用以下声明将BIG_CITIES声明和初始化为恒定全局数组:

const string BIG_CITIES[] = {
    "New York",
    "Los Angeles",
    "Chicago",
    "Houston",
    "Philadelphia",
    "Phoenix",
    "San Antonio",
    "San Diego",
    "Dallas",
};

然而,这个列表在时间上不是静态的。在1990年至2000年的人口普查结果之间,Detroit在Phoenix和San Antonio加入时,也掉下了名单。 当2020年人口普查结果显示,San Jose可能会加入超过100万人口的城市名单。如果你负责维护包含此代码的程序,你最后要做的是计算列表中有多少个城市,以便程序可以确定有多少个元素。你想要做的是更新城市列表,并让编译器弄清楚有多少个这样的城市。(因为我们可以更该数组里面的数据,假如我们增加一个Detroit,那么数组的长度就会加1,而数组的长度我们没指定,系统会帮我们自动算,所以说BIG_CITIES不是静态的,我们才要采取不同的方式去计算数组的长度
幸运的是,C ++提供了一个标准的用语,用于确定使用静态初始化设置元素数量的数组的分配大小。 给定一个名为MY_ARRAY的静态初始化数组,MY_ARRAY中的元素数量可以使用惯用模式:

sizeof MY_ARRAY / sizeof MY_ARRAY[0]

该表达式取整个数组的大小,并将其除以数组中初始元素的大小。因为数组的所有元素的大小相同,所以结果是数组中元素的数量,不管元素的类型如何。可以初始化一个变量N_BIG_CITIES,以通过写入来保存bigCities数组中的城市数:

const int N_BIG_CITIES = sizeof BIG_CITIES / sizeof BIG_CITIES[0];

示例

#include <iostream>
using namespace std;
int main(){
    const string BIG_CITIES[] = {
    "New York",
    "Los Angeles",
    "Chicago",
    "Houston",
    "Philadelphia",
    "Phoenix",
    "San Antonio",
    "San Diego",
    "Dallas",
    };
    const int N_BIG_CITIES = sizeof BIG_CITIES / sizeof BIG_CITIES[0];
    cout << N_BIG_CITIES << endl;
    return 0;
}

输出的结果为:

原理很简单,sizeof算的是字节长,那么总的字节长除以该类型的某个元素的长度,自然就是元素个数(比如一个int型的数组,1 2 3 4. 那么sizeof是总的字节长16,一个int型长度为4,16/4 = 4,就这样算的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值