C/C++教程

C++学习笔记13:数组

本文主要是介绍C++学习笔记13:数组,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

数组(array)是一种数据格式,能够存储多个同类型的值。使用数组声明创建数组时,应指出以下三点:

  • 存储在每个元素中的值的类型;
  • 数组名;
  • 数组中的元素数(必须是整型常数、或 const 值、或常量表达式)。

声明数组的通用格式如下:
typeName arrayName[arraySize];
单独访问数组元素:使用下标或索引来对元素进行编号,C++数组从0开始编号,使用带索引的方括号表示法来指定数组元素。
下面的程序说明了数组的一些属性,包括声明数组、给数组元素赋值以及初始化数组。

//arrayone.cpp -- small arrays of integers 整型数组示例
#include <iostream>
using namespace std;

int main()
{
	int yams[3];       //创建包含3个元素的整型数组
	//为数组的每个元素赋值
	yams[0] = 7;
	yams[1] = 8;
	yams[2] = 6;

	int yamcosts[3] = { 20,30,5 };    //创建并初始化一个3元素整型数组

	cout << "Total yams = ";
	cout << yams[0] + yams[1] + yams[2] << endl;
	cout << "The package with " << yams[1] << " yams costs ";
	cout << yamcosts[1] << " cents per yam.\n";
	int total = yams[0] * yamcosts[0] + yams[1] * yamcosts[1];
	total = total + yams[2] * yamcosts[2];
	cout << "The total yam expense is " << total << " cents.\n";

	cout << "\nSize of yams array = " << sizeof yams << " bytes.\n";
	cout << "Size of one element = " << sizeof yams[0] << " bytes.\n";

	return 0;
}

 数组的初始化规则:

  • 只有在定义数组时才能使用初始化,此后就不能使用了(可以利用下标分别给数组中的元素赋值),也不能将一个数组赋给另一个数组。
  • 初始化数组时,提供的值可以少于数组的元素数目。如果只对数组的一部分进行初始化,则编译器将把其他元素设置为 0。
  • 如果初始化数组时方括号([ ])内为空,C++编译器将计算元素个数。

C++11数组初始化方法:
在C++11中,数组使用列表初始化的一些新功能:

  1. 初始化数组时,可省略等号(=);
  2. 可不在大括号内包含任何东西,这将把所有元素都设置为零;
  3. 列表初始化禁止缩窄转换。

数组的替代品:
一、模板类 vector
首先,要使用 vector 对象,必须包含头文件 vector,其次,vector 包含在名称空间 std 中,因此可使用 using 编译指令、using 声明或 std::vector。一般而言,下面的声明创建一个名为 vt 的 vector 对象,它可以存储 n_elem 个类型为 typeName 的元素:
vector<typeName> vt(n_elem);
其中,参数 n_elem 可以是整型常量,也可以是整型变量。
二、模板类 array
首先,要使用 array 对象,必须包含头文件 array,其次,array 也包含在名称空间 std 中,因此可使用 using 编译指令、using 声明或 std::array。一般而言,下面的声明创建一个名为 arr 的 array 对象,它可以存储 n_elem 个类型为 typeName 的元素:
array<typeName, n_elem> arr;
其中,参数 n_elem 不能是变量。

下面的程序展示了一些数组、vector 对象和 array 对象的相似和不同之处。

//choices.cpp -- 数组、vector对象、array对象
#include <iostream>
#include <vector>
#include <array>
using namespace std;

int main()
{
	// C, original C++
	double a1[4] = { 1.2,2.4,3.6,4.8 };
	// C++98 STL -- 创建vector对象
	vector<double> a2(4);
	a2[0] = 1.0 / 3.0;
	a2[1] = 1.0 / 5.0;
	a2[2] = 1.0 / 7.0;
	a2[3] = 1.0 / 9.0;
	// C++11 -- 创建并初始化array对象
	array<double, 4> a3 = { 3.14,2.72,1.62,1.41 };
	array<double, 4> a4;
	a4 = a3;              //可以将一个array对象赋给另一个array对象,前提是二者类型、元素数量一致,而数组只能逐元素复制数据
	// use array notation 无论是数组、vector对象还是array对象,都可以利用数组表示法访问元素
	cout << "a1[2]: " << a1[2] << " at " << &a1[2] << endl;
	cout << "a2[2]: " << a2[2] << " at " << &a2[2] << endl;     //vector对象存储在另一个区域(自由存储区或堆)中
	cout << "a3[2]: " << a3[2] << " at " << &a3[2] << endl;     //array对象和数组存储在相同的内存区域(即栈)中
	cout << "a4[2]: " << a4[2] << " at " << &a4[2] << endl;
	// misdeed 错误行为
	a1[-2] = 20.2;        //索引-2等于 *(a1-2) = 20.2; 含义:找到a1指定的地方,向前移两个double元素,并将20.2存储到目的地,即将信息存储到数组外面(越界错误)
	cout << "a1[-2]: " << a1[-2] << " at " << &a1[-2] << endl;
	cout << "a3[2]: " << a3[2] << " at " << &a3[2] << endl;
	cout << "a4[2]: " << a4[2] << " at " << &a4[2] << endl;

	return 0;
}
这篇关于C++学习笔记13:数组的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!