数组(array)是一种数据格式,能够存储多个同类型的值。使用数组声明创建数组时,应指出以下三点:
声明数组的通用格式如下:
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; }
数组的初始化规则:
C++11数组初始化方法:
在C++11中,数组使用列表初始化的一些新功能:
数组的替代品:
一、模板类 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; }