目录
- 概述
- 数组的基本概念与定义
- 数组的存储方式
- 数组的初始化与赋值
- 数组的访问与遍历
- 数组的操作函数
- 常见数组操作案例解析
- 数组的应用场景
- 总结
重难点声明
- 数组是C++中最基础的数据结构之一,但其复杂性在于多维数组的实现与操作。
- 多层难度的堆叠方式要求读者在理解单维数组的基础上,逐步掌握二维、三维甚至更高阶数组的操作技巧。
概述
数组是一种线性数据结构,用于存储一组具有相同类型的数据元素。其基本特性包括:固定大小、顺序存储、随机访问。C++中支持多层数组的实现,能够满足复杂场景的需求。
数组的基本概念
- 单维数组:一维数组是最简单的数组形式,每个元素占据固定的位置。
- 多维数组:二维及以上数组通过扩展单维数组的概念实现,常用于图像处理、矩阵运算等领域。
数组的存储方式
C++中的数组在内存中以连续块的形式存储。其存储方式遵循以下规则:
- 单维数组:按顺序存储,每个元素占据固定内存地址。
- 二维及以上数组:按行或列优先顺序存储,具体实现依赖于语言设计。
数组的内存分配
C++支持动态数组(vector
)和静态数组(内置数组)。动态数组可以根据需求扩展,而静态数组在初始化时即确定大小。
数组的初始化与赋值
数组的初始化是将预定义值赋给每个元素的过程。赋值操作可以通过多种方式实现:
- 直接赋值:将常量或变量直接分配给数组。
- 遍历赋值:通过循环将源数据逐个赋入目标数组。
初始化示例
int arr[] = {1, 2, 3}; // 初始化单维数组
int matrix[3][3] = {{0}, {1, 2}, {3, 4, 5}}; // 初始化二维数组
数组的访问与遍历
访问数组元素通过索引实现,支持正向和逆向遍历。多层数组需要嵌套索引操作。
遍历示例
// 正向遍历单维数组
for (int i = 0; i < arr.size(); ++i) {
std::cout << arr[i] << " ";
}
// 逆向遍历二维数组
for (int i = matrix.size() - 1; i >= 0; --i) {
for (int j = matrix[i].size() - 1; j >= 0; --j) {
std::cout << matrix[i][j] << " ";
}
}
数组的操作函数
C++提供多种内置函数用于数组操作,包括创建、初始化、访问和修改等。
常见操作函数示例
// 初始化为零值
int matrix[N][M] = {{0}};
// 赋值为空字符串(适用于字符型数组)
char str[] = {}; // 或 std::string str(N, '\0');
// 访问第i个元素
int val = arr[i];
// 修改元素
arr[j] = newValue;
常见数组操作案例解析
案例1:单维数组的求和
#include <iostream>
using namespace std;
int main() {
int arr[] = {1, 2, 3, 4, 5};
int sum = 0;
for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i) {
sum += arr[i];
}
cout << "数组和:" << sum << endl;
return 0;
}
案例2:二维数组的转置
#include <iostream>
using namespace std;
void transpose(int matrix[N][M]) {
int transposed[M][N];
for (int i = 0; i < N; ++i) { // 列索引
for (int j = 0; j < M; ++j) { // 行索引
transposed[j][i] = matrix[i][j];
}
}
// 输出转置后的矩阵
for (int i = 0; i < M; ++i) {
for (int j = 0; j < N; ++j) {
cout << transposed[i][j] << " ";
}
cout << endl;
}
}
int main() {
int matrix[N][M] = { /* 初始化矩阵 */ };
transpose(matrix);
return 0;
}
案例3:三维数组的查找
#include <iostream>
using namespace std;
bool findIn3D(int arr[Layers][Rows][Cols], int target) {
for (int l = 0; l < Layers; ++l) {
for (int r = 0; r < Rows; ++r) {
for (int c = 0; c < Cols; ++c) {
if (arr[l][r][c] == target) {
return true;
}
}
}
}
return false;
}
int main() {
int arr[Layers][Rows][Cols]; // 初始化三维数组
if (findIn3D(arr, 42)) {
cout << "元素42存在!" << endl;
} else {
cout << "元素42不存在." << endl;
}
return 0;
}
应用场景
场景1:数据存储
- 单维数组:用于存储一维数据,如学生成绩。
- 多维数组:用于存储二维数据,如图像像素。
场景2:算法优化
- 使用数组的随机存取特性优化遍历效率。
- 通过数组实现快速查找、插入和删除操作。
C++ 数组常用函数列表及示例
| 功能名称 | 对应的 C++ 函数 | 参数说明 | 示例代码
|
|----------------------|-------------------------|------------------------------------------------------------------------------|-------------------------------||----------------------|-------------------------|------------------------------------------------------------------------------|-------------------------------------------------------------------------------|
| 1. 数组初始化 | std::memset
或自定义 | 初始化数组为零值。std:: memset
适用于单维和多维数组,但需注意内存分配。 | 初始化一个整型数组为零:
int arr[size] = {0};
|
| 2. 数组初始化为空 | std::vector
或自定义 | 使用容器类如 std::vector
来动态管理数组空间,或手动分配内存并初始化为空。| 初始化一个空的整型向量:
std::vector arr;
|
| 3. 填充值 | memset
, std::fill
| 填充数组元素为特定值。memset
适用于单维数组,std::fill
可用于多维数组。 | 填充一个字符数组为 ‘x’:
char buf[10] = {0}; memset(buf, 'x', sizeof(buf));
|
| 4. 初始化为常量值 | std::memset
, std::fill
| 将数组元素初始化为特定的常量值。适用于单维和多维数组。 | 初始化一个浮点型数组为 3.14:
float arr[size] = {3.14};
|
| 5. 获取数组大小 | sizeof
或 arr.size()
| 获取单维或多维数组的长度。 | 获取一个整型数组的大小:
int
n = sizeof(arr) / sizeof(arr[0]);
|
| 6. 获取多维数组维度 |
arr.size()
| 获取多维数组的第一个维度大小(行数)。 | 获取一个二维整型数组的行数:
int rows = arr.size();
|
| 7. 获取多维数组元素 | 访问器或直接索引 | 使用迭代器或索引来访问多维数组中的具体元素。 | 访问二维数组的第一个元素:
auto begin = arr.begin(); auto element = *begin; // 或者 arr[0][0]
|
| 8. 查找数组元素 | std::find
| 遍历数组或直接使用函数查找特定值的位置。 | 查找一个字符数组中的 ‘a’:
auto it = std::find(buf, buf + sizeof(buf), 'a');
|
| 9. 修改数组元素 | 直接赋值或迭代器 | 使用索引直接修改单个元素,或通过迭代器遍历数组进行修改。 | 更新一个整型数组的第三个元素:
arr[2] = 42; std::for_each(arr.begin(), arr.end(), [](int &x) { x += 1; });
|
| 10. 填充多维数组 | std::fill
| 遍历并填充多维数组的所有元素为特定值。 | 填充一个二维整型数组:
std::fill(arr.begin(), arr.end(), 0);
|
示例代码
以下是一个完整的示例,展示了如何使用上述函数操作数组:
#include <cstring>
#include <vector>
int main() {
// 示例 1:初始化整型数组为零值,并填充为特定值
int arr1[5] = {0}; // 初始化为零
std::memset(arr1, 'x', sizeof(arr1)); // 将所有元素替换为 'x'
// 示例 2:使用向量初始化为空
std::vector<int> arr2;
// 示例 3:填充字符数组
char buf[10] = {0};
memset(buf, '\0', sizeof(buf)); // 初始化为零字节
// 示例 4:初始化浮点型数组为特定值
float arr3[3] = {3.14f}; // 使用默认构造函数初始化
// 示例 5:获取单维和多维数组的大小
int singleSize = sizeof(arr1) / sizeof(int); // 获取单维数组长度
std::cout << "Single array size: " << singleSize << std::endl;
std::vector<std::string> arr4 = {"apple", "banana"};
int dimSize = arr4.size(); // 获取多维数组的第一个维度大小
std::cout << "Multi-dimensional size: " << dimSize << std::endl;
// 示例 6:访问多维数组的元素
auto* arr5 = &arr3[0]; // 指向单维数组的首元素
int value = *arr5; // 获取第一个元素的值
// 示例 7:查找数组中的特定元素
bool found = std::find(arr1, arr1 + sizeof(arr1), 'x'); // 查找字符数组中是否有 'x'
// 示例 8:修改数组中的多个元素
for (int i = 0; i < singleSize; ++i) {
arr3[i] += i * 3.14f;
}
// 示例 9:填充多维数组的所有元素为零
std::fill(arr2.begin(), arr2.end(), 0);
return 0;
}
总结
本文详细介绍了C++中数组的初始化、访问、赋值以及常见的操作函数。通过实际案例展示了如何灵活运用数组进行数据存储和处理,为后续学习高级编程技巧打下基础。