C++ 中数组的声明、初始化与常见操作实践
一维数组的基本用法
在 C++ 中,数组是一组相同类型元素的连续内存集合。定义时需指定类型和大小(编译期常量),例如:
#include <iostream>
int main() {
int scores[12]; // 存储 12 个整数
double weights[50]; // 50 个双精度浮点数
char name[32]; // 最多容纳 31 字符 + '\0'
return 0;
}
初始化策略
未显式初始化的局部数组内容不可预测;全局或静态数组默认为零值。支持多种初始化方式:
int nums1[4] = {10, 20, 30, 40}; // 显式全部赋值
int nums2[] = {5, 15, 25}; // 编译器推导长度为 3
int nums3[6] = {1, 2}; // 剩余元素自动补 0 → {1,2,0,0,0,0}
char str[7] = "Hello"; // 等价于 {'H','e','l','l','o','\0'},末尾隐含空字符
索引与元素访问
数组下标从 0 开始,越界访问不触发编译错误但属未定义行为。安全访问示例:
#include <iostream>
int main() {
int data[3] = {100, 200, 300};
std::cout << data[0] << " " << data[2] << "\n"; // 输出:100 300
data[1] = 250; // 修改中间元素
std::cout << data[1] << "\n"; // 输出:250
}
典型应用场景
- 斐波那契数列第 n 项计算(n ≥ 0)
#include <iostream>
int main() {
int N;
std::cin >> N;
long long fib[10001] = {0, 1}; // 初始化前两项
for (int i = 2; i <= N; ++i) {
fib[i] = fib[i - 1] + fib[i - 2];
}
std::cout << fib[N] << "\n";
}
- 逆序输出整数序列
#include <iostream>
int main() {
int count;
std::cin >> count;
int values[1000];
for (int i = 0; i < count; ++i) {
std::cin >> values[i];
}
for (int i = count - 1; i >= 0; --i) {
std::cout << values[i] << " ";
}
std::cout << "\n";
}
- 循环右移 k 位(k ≤ n)
利用三次翻转实现 O(n) 时间复杂度:
#include <iostream>
void reverse(int arr[], int start, int end) {
while (start < end) {
std::swap(arr[start], arr[end]);
++start;
--end;
}
}
int main() {
int len, shift;
std::cin >> len >> shift;
int seq[1000];
for (int i = 0; i < len; ++i) {
std::cin >> seq[i];
}
// 右移k等价于:翻转[0,len-k), 翻转[len-k,len), 再翻转整个数组
int pivot = len - shift % len;
reverse(seq, 0, pivot - 1);
reverse(seq, pivot, len - 1);
reverse(seq, 0, len - 1);
for (int i = 0; i < len; ++i) {
std::cout << seq[i] << " ";
}
std::cout << "\n";
}
- 简单选择排序(升序)
#include <iostream>
int main() {
int size;
std::cin >> size;
int items[1000];
for (int i = 0; i < size; ++i) {
std::cin >> items[i];
}
for (int i = 0; i < size - 1; ++i) {
int min_idx = i;
for (int j = i + 1; j < size; ++j) {
if (items[j] < items[min_idx]) {
min_idx = j;
}
}
std::swap(items[i], items[min_idx]);
}
for (int i = 0; i < size; ++i) {
std::cout << items[i] << " ";
}
std::cout << "\n";
}
- 大整数幂运算(2^N,N ≤ 10000)
使用十进制数组模拟高精度乘法:
#include <iostream>
#include <vector>
int main() {
int N;
std::cin >> N;
std::vector<int> digits = {1}; // 初始值为 1
for (int i = 0; i < N; ++i) {
int carry = 0;
for (size_t j = 0; j < digits.size(); ++j) {
int product = digits[j] * 2 + carry;
digits[j] = product % 10;
carry = product / 10;
}
while (carry) {
digits.push_back(carry % 10);
carry /= 10;
}
}
for (auto it = digits.rbegin(); it != digits.rend(); ++it) {
std::cout << *it;
}
std::cout << "\n";
}
二维及更高维数组
多维数组本质是"数组的数组"。声明格式为 type name[dim1][dim2]...,内存按行优先连续布局:
int matrix[3][4]; // 3 行 × 4 列整型矩阵
double cube[2][3][4] = {}; // 全零初始化的三维数组
int grid[][3] = {{1,2,3}, {4,5,6}}; // 编译器推导第一维为 2
矩阵螺旋遍历(顺时针)
通过维护边界坐标控制遍历方向,避免额外标记数组:
#include <iostream>
int main() {
int rows, cols;
std::cin >> rows >> cols;
int board[50][50];
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
std::cin >> board[i][j];
}
}
int top = 0, bottom = rows - 1;
int left = 0, right = cols - 1;
while (top <= bottom && left <= right) {
// 上边:从左到右
for (int j = left; j <= right; ++j) std::cout << board[top][j] << " ";
++top;
// 右边:从上到下
for (int i = top; i <= bottom; ++i) std::cout << board[i][right] << " ";
--right;
// 下边:从右到左(需再次判断)
if (top <= bottom) {
for (int j = right; j >= left; --j) std::cout << board[bottom][j] << " ";
--bottom;
}
// 左边:从下到上
if (left <= right) {
for (int i = bottom; i >= top; --i) std::cout << board[i][left] << " ";
++left;
}
}
std::cout << "\n";
}