数组操作伪代码
循环 i 从 0 到 n-1:
访问(读取或处理) arr[i]
循环 i 从 n-1 到 0 (递减):
访问(读取或处理) arr[i]
循环 i 从 0 到 n-1:
如果 arr[i] 等于 target:
返回 索引 i (表示找到)
如果 循环结束仍未找到:
返回 -1 (或其他表示未找到的值)
设置 max_value = arr[0]
设置 max_index = 0
循环 i 从 1 到 n-1:
如果 arr[i] 大于 max_value:
max_value = arr[i]
max_index = i
返回 max_index (或 max_value)
设置 min_value = arr[0]
设置 min_index = 0
循环 i 从 1 到 n-1:
如果 arr[i] 小于 min_value:
min_value = arr[i]
min_index = i
返回 min_index (或 min_value)
检查 pos 是否在有效范围 [0, n]
循环 j 从 n-1 到 pos (递减):
将 arr[j] 的值移动到 arr[j+1]
将 value 放入 arr[pos]
增加 数组当前元素数量 n (n++)
检查 pos 是否在有效范围 [0, n-1]
循环 j 从 pos 到 n-2:
将 arr[j+1] 的值移动到 arr[j]
减少 数组当前元素数量 n (n--)
C++ 实现示例
#include <iostream>
#include <vector>
#include <limits>
using namespace std;
int main() {
const int MAX_SIZE = 10;
int arr[MAX_SIZE] = {12, 45, 8, 23, 56};
int current_size = 5;
cout << "顺序遍历: ";
for(int i = 0; i < current_size; ++i) {
cout << arr[i] << " ";
}
cout << endl;
cout << "反向遍历: ";
for(int i = current_size - 1; i >= 0; --i) {
cout << arr[i] << " ";
}
cout << endl;
int target = 23;
int found_index = -1;
for(int i = 0; i < current_size; ++i) {
if(arr[i] == target) {
found_index = i;
break;
}
}
if (found_index != -1) {
cout << "找到 " << target << " 在索引: " << found_index << endl;
} else {
cout << target << " 未找到" << endl;
}
if (current_size > 0) {
int max_val = arr[0];
int max_idx = 0;
for (int i = 1; i < current_size; ++i) {
if (arr[i] > max_val) {
max_val = arr[i];
max_idx = i;
}
}
cout << "最大值: " << max_val << " 在索引: " << max_idx << endl;
}
int insert_pos = 2;
int insert_val = 99;
if (current_size < MAX_SIZE && insert_pos >= 0 && insert_pos <= current_size) {
for (int i = current_size; i > insert_pos; --i) {
arr[i] = arr[i - 1];
}
arr[insert_pos] = insert_val;
current_size++;
cout << "插入 " << insert_val << " 后: ";
for(int i = 0; i < current_size; ++i) cout << arr[i] << " ";
cout << endl;
} else {
cerr << "插入失败: 数组已满或位置无效" << endl;
}
int delete_pos = 3;
if (delete_pos >= 0 && delete_pos < current_size) {
for (int i = delete_pos; i < current_size - 1; ++i) {
arr[i] = arr[i + 1];
}
current_size--;
cout << "删除索引 " << delete_pos << " 后: ";
for(int i = 0; i < current_size; ++i) cout << arr[i] << " ";
cout << endl;
} else {
cerr << "删除失败: 位置无效" << endl;
}
return 0;
}
注意: 上述代码使用原生 C++ 数组,需要手动管理大小和边界。在实际项目中,更推荐使用 vector
,它能自动管理内存和大小,并提供更安全的操作(如 push_back
, insert
, erase
, at()
)。
扩展知识
指针算术 (Pointer Arithmetic)
指针算术允许对指针进行加减运算,移动指针指向内存中的不同位置。关键在于,指针加 1 实际上是移动sizeof(类型)
个字节。
int arr[5]; int* ptr = arr;
ptr + 1
指向 arr[1]
的地址。
*(ptr + i)
等价于 arr[i]
,用于通过指针访问数组元素。
ptr++
使指针指向下一个元素。
- 两个指向同一数组内元素的指针可以相减,结果是它们之间相隔的元素数量。
指针算术是 C/C++ 强大但也容易出错的特性,必须确保指针始终指向有效的内存区域。
动态数组与边界检查
原生数组的大小在编译时确定,无法在运行时改变。需要动态大小的数组时:
- C-Style (
new[]
/ delete[]
):
int* dynamicArr = new int[size];
... 使用 dynamicArr ...
delete[] dynamicArr;
这很灵活,但也容易内存泄漏或悬挂指针。没有内置边界检查。
- C++ Standard Library (
vector
):
#include <vector>
using namespace std;
vector vec = {1, 2, 3};
vec.push_back(4);
vec.insert(vec.begin() + 1, 99);
int val = vec.at(0);
int val_unsafe = vec[0];
vector
自动管理内存,更安全、方便,是现代 C++ 的首选。
内存对齐 (Memory Alignment)
为了提高 CPU 访问效率,编译器可能会在结构体成员之间或数组元素之后插入一些填充字节 (padding),使得数据的起始地址是某个值(如 4 或 8)的倍数。这可能导致 sizeof(struct)
大于其所有成员大小之和。
缓存局部性 (Cache Locality)
由于数组元素在内存中是连续存储的,当访问一个元素时,CPU 缓存通常会预加载其附近的元素。这使得顺序访问数组(如遍历)非常快,因为后续访问的数据很可能已经在高速缓存中。这就是所谓的“空间局部性”。