C++ 中的数组是存储相同类型元素的连续内存块。数组分为一维数组和多维数组,是程序设计中最基础的数据结构之一。

一维数组

一维数组的声明和初始化

#include <iostream>
 
int main() {
    // 1. 声明数组(未初始化,包含垃圾值)
    int arr1[5];  // 声明包含5个int元素的数组
    
    // 2. 声明并初始化
    int arr2[5] = {1, 2, 3, 4, 5};  // 完全初始化
    int arr3[5] = {1, 2, 3};        // 部分初始化,剩余元素为0
    int arr4[5] = {0};              // 所有元素初始化为0
    int arr5[5] = {};               // C++11:所有元素初始化为0
    
    // 3. 自动推导数组大小
    int arr6[] = {1, 2, 3, 4, 5, 6};  // 编译器推导大小为6
    
    // 4. C++11 统一初始化
    int arr7{1, 2, 3, 4, 5};
    
    // 5. 字符数组
    char str1[10] = "Hello";     // 字符串字面量初始化
    char str2[] = "World";       // 自动推导大小
    char str3[6] = {'H', 'e', 'l', 'l', 'o', '\0'};  // 字符初始化
    
    // 输出数组内容
    std::cout << "arr2: ";
    for (int i = 0; i < 5; ++i) {
        std::cout << arr2[i] << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

数组的访问和操作

#include <iostream>
#include <algorithm>  // for std::sort, std::find
 
void printArray(int arr[], int size) {
    for (int i = 0; i < size; ++i) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;
}
 
int main() {
    int numbers[10] = {5, 2, 8, 1, 9, 3, 7, 4, 6, 0};
    int size = sizeof(numbers) / sizeof(numbers[0]);  // 计算数组大小
    
    std::cout << "Original array: ";
    printArray(numbers, size);
    
    // 1. 数组元素访问
    std::cout << "First element: " << numbers[0] << std::endl;
    std::cout << "Last element: " << numbers[size-1] << std::endl;
    
    // 2. 修改数组元素
    numbers[0] = 100;
    numbers[size-1] = 200;
    
    // 3. 遍历数组
    std::cout << "Modified array: ";
    for (int i = 0; i < size; ++i) {
        std::cout << numbers[i] << " ";
    }
    std::cout << std::endl;
    
    // 4. 使用范围for循环(C++11)
    std::cout << "Using range-based for: ";
    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    // 5. 查找元素
    int target = 8;
    int* found = std::find(numbers, numbers + size, target);
    if (found != numbers + size) {
        std::cout << "Found " << target << " at index " 
                  << (found - numbers) << std::endl;
    }
    
    // 6. 排序数组
    std::sort(numbers, numbers + size);
    std::cout << "Sorted array: ";
    printArray(numbers, size);
    
    return 0;
}

数组作为函数参数

#include <iostream>
 
// 方式1:数组参数(实际上是指针)
void processArray1(int arr[], int size) {
    std::cout << "In function, sizeof(arr) = " << sizeof(arr) << std::endl;  // 指针大小
    for (int i = 0; i < size; ++i) {
        arr[i] *= 2;  // 修改原数组
    }
}
 
// 方式2:指针参数(等价于方式1)
void processArray2(int* arr, int size) {
    for (int i = 0; i < size; ++i) {
        arr[i] += 10;
    }
}
 
// 方式3:引用参数(需要指定大小)
void processArray3(int (&arr)[5]) {
    for (int i = 0; i < 5; ++i) {
        arr[i] -= 5;
    }
}
 
// 方式4:模板参数(C++11)
template<size_t N>
void processArray4(int (&arr)[N]) {
    for (size_t i = 0; i < N; ++i) {
        arr[i] /= 2;
    }
}
 
// 返回数组(实际返回指针)
int* createArray(int size) {
    int* arr = new int[size];  // 动态分配
    for (int i = 0; i < size; ++i) {
        arr[i] = i + 1;
    }
    return arr;
}
 
int main() {
    int numbers[5] = {1, 2, 3, 4, 5};
    
    std::cout << "Original: ";
    for (int num : numbers) std::cout << num << " ";
    std::cout << std::endl;
    
    processArray1(numbers, 5);
    std::cout << "After processArray1: ";
    for (int num : numbers) std::cout << num << " ";
    std::cout << std::endl;
    
    processArray2(numbers, 5);
    std::cout << "After processArray2: ";
    for (int num : numbers) std::cout << num << " ";
    std::cout << std::endl;
    
    processArray3(numbers);
    std::cout << "After processArray3: ";
    for (int num : numbers) std::cout << num << " ";
    std::cout << std::endl;
    
    processArray4(numbers);
    std::cout << "After processArray4: ";
    for (int num : numbers) std::cout << num << " ";
    std::cout << std::endl;
    
    // 动态数组
    int* dynamicArr = createArray(3);
    std::cout << "Dynamic array: ";
    for (int i = 0; i < 3; ++i) {
        std::cout << dynamicArr[i] << " ";
    }
    std::cout << std::endl;
    delete[] dynamicArr;  // 释放内存
    
    return 0;
}

多维数组

二维数组

#include <iostream>
 
int main() {
    // 1. 二维数组的声明和初始化
    int matrix1[3][4];  // 3行4列的矩阵(未初始化)
    
    // 2. 完全初始化
    int matrix2[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    
    // 3. 部分初始化
    int matrix3[3][4] = {
        {1, 2},        // 第一行:1, 2, 0, 0
        {5, 6, 7},     // 第二行:5, 6, 7, 0
        {}             // 第三行:0, 0, 0, 0
    };
    
    // 4. 一维方式初始化
    int matrix4[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
    
    // 5. 全零初始化
    int matrix5[3][4] = {};
    
    // 6. 自动推导第一维大小
    int matrix6[][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8}
    };  // 自动推导为2行4列
    
    // 输出二维数组
    std::cout << "matrix2:" << std::endl;
    for (int i = 0; i < 3; ++i) {
        for (int j = 0; j < 4; ++j) {
            std::cout << matrix2[i][j] << "\t";
        }
        std::cout << std::endl;
    }
    
    return 0;
}

二维数组的操作

#include <iostream>
#include <iomanip>
 
// 打印二维数组
void printMatrix(int matrix[][4], int rows) {
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < 4; ++j) {
            std::cout << std::setw(4) << matrix[i][j];
        }
        std::cout << std::endl;
    }
}
 
// 矩阵转置
void transpose(int source[][4], int dest[][3], int rows, int cols) {
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            dest[j][i] = source[i][j];
        }
    }
}
 
// 查找元素
bool findElement(int matrix[][4], int rows, int cols, int target, int& row, int& col) {
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            if (matrix[i][j] == target) {
                row = i;
                col = j;
                return true;
            }
        }
    }
    return false;
}
 
int main() {
    int matrix[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    
    std::cout << "Original matrix:" << std::endl;
    printMatrix(matrix, 3);
    
    // 访问和修改元素
    std::cout << "\nElement at [1][2]: " << matrix[1][2] << std::endl;
    matrix[1][2] = 100;
    std::cout << "After modification:" << std::endl;
    printMatrix(matrix, 3);
    
    // 计算行和列的总和
    std::cout << "\nRow sums: ";
    for (int i = 0; i < 3; ++i) {
        int rowSum = 0;
        for (int j = 0; j < 4; ++j) {
            rowSum += matrix[i][j];
        }
        std::cout << rowSum << " ";
    }
    std::cout << std::endl;
    
    std::cout << "Column sums: ";
    for (int j = 0; j < 4; ++j) {
        int colSum = 0;
        for (int i = 0; i < 3; ++i) {
            colSum += matrix[i][j];
        }
        std::cout << colSum << " ";
    }
    std::cout << std::endl;
    
    // 查找元素
    int row, col;
    if (findElement(matrix, 3, 4, 100, row, col)) {
        std::cout << "\nFound 100 at position [" << row << "][" << col << "]" << std::endl;
    }
    
    // 矩阵转置
    int transposed[4][3];
    transpose(matrix, transposed, 3, 4);
    std::cout << "\nTransposed matrix:" << std::endl;
    for (int i = 0; i < 4; ++i) {
        for (int j = 0; j < 3; ++j) {
            std::cout << std::setw(4) << transposed[i][j];
        }
        std::cout << std::endl;
    }
    
    return 0;
}

三维数组和更高维数组

#include <iostream>
 
int main() {
    // 三维数组:可以想象为多个二维数组的集合
    int cube[2][3][4] = {
        {  // 第一个2D数组
            {1, 2, 3, 4},
            {5, 6, 7, 8},
            {9, 10, 11, 12}
        },
        {  // 第二个2D数组
            {13, 14, 15, 16},
            {17, 18, 19, 20},
            {21, 22, 23, 24}
        }
    };
    
    // 访问三维数组元素
    std::cout << "Three-dimensional array:" << std::endl;
    for (int i = 0; i < 2; ++i) {
        std::cout << "Layer " << i << ":" << std::endl;
        for (int j = 0; j < 3; ++j) {
            for (int k = 0; k < 4; ++k) {
                std::cout << cube[i][j][k] << "\t";
            }
            std::cout << std::endl;
        }
        std::cout << std::endl;
    }
    
    // 四维数组示例
    int hyperCube[2][2][2][2];
    
    // 初始化四维数组
    int value = 1;
    for (int i = 0; i < 2; ++i) {
        for (int j = 0; j < 2; ++j) {
            for (int k = 0; k < 2; ++k) {
                for (int l = 0; l < 2; ++l) {
                    hyperCube[i][j][k][l] = value++;
                }
            }
        }
    }
    
    // 输出四维数组的一部分
    std::cout << "Four-dimensional array [0][0]:" << std::endl;
    for (int k = 0; k < 2; ++k) {
        for (int l = 0; l < 2; ++l) {
            std::cout << hyperCube[0][0][k][l] << " ";
        }
        std::cout << std::endl;
    }
    
    return 0;
}

动态数组

动态数组是在程序运行时根据需要分配内存的数组,其大小可以在运行时确定。C++提供了多种创建和管理动态数组的方法。

一维动态数组

方法一:使用 new/delete(传统方法)

#include <iostream>
#include <memory>
 
int main() {
    int size;
    std::cout << "请输入数组大小: ";
    std::cin >> size;
    
    // 1. 使用 new/delete
    int* dynamicArray = new int[size];
    
    // 初始化
    for (int i = 0; i < size; ++i) {
        dynamicArray[i] = i * i;
    }
    
    // 使用
    std::cout << "动态数组内容: ";
    for (int i = 0; i < size; ++i) {
        std::cout << dynamicArray[i] << " ";
    }
    std::cout << std::endl;
    
    // 修改数组元素
    dynamicArray[0] = 100;
    std::cout << "修改后第一个元素: " << dynamicArray[0] << std::endl;
    
    // 重要:释放内存
    delete[] dynamicArray;
    dynamicArray = nullptr;  // 避免悬空指针
    
    return 0;
}

方法二:使用智能指针(推荐)

#include <iostream>
#include <memory>
 
int main() {
    int size;
    std::cout << "请输入数组大小: ";
    std::cin >> size;
    
    // 使用 unique_ptr 管理动态数组
    std::unique_ptr<int[]> smartArray(new int[size]);
    
    // 或者使用 make_unique (C++14及以后)
    // auto smartArray = std::make_unique<int[]>(size);
    
    // 初始化
    for (int i = 0; i < size; ++i) {
        smartArray[i] = (i + 1) * 10;
    }
    
    // 使用
    std::cout << "智能指针管理的动态数组: ";
    for (int i = 0; i < size; ++i) {
        std::cout << smartArray[i] << " ";
    }
    std::cout << std::endl;
    
    // 自动释放内存,无需手动delete
    return 0;
}

方法三:使用 std::vector(最推荐)

#include <iostream>
#include <vector>
#include <algorithm>
 
int main() {
    int size;
    std::cout << "请输入数组大小: ";
    std::cin >> size;
    
    // 使用 vector
    std::vector<int> dynamicVector(size);
    
    // 初始化
    for (int i = 0; i < size; ++i) {
        dynamicVector[i] = i * 2 + 1;
    }
    
    // 使用
    std::cout << "vector动态数组: ";
    for (const auto& element : dynamicVector) {
        std::cout << element << " ";
    }
    std::cout << std::endl;
    
    // vector的优势:可以动态调整大小
    dynamicVector.push_back(999);  // 添加元素
    std::cout << "添加元素后大小: " << dynamicVector.size() << std::endl;
    
    // 使用算法
    std::sort(dynamicVector.begin(), dynamicVector.end());
    std::cout << "排序后: ";
    for (const auto& element : dynamicVector) {
        std::cout << element << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

二维动态数组

方法一:使用指针的指针

#include <iostream>
 
// 创建二维动态数组
int** create2DArray(int rows, int cols) {
    int** array = new int*[rows];
    for (int i = 0; i < rows; ++i) {
        array[i] = new int[cols];
    }
    return array;
}
 
// 释放二维动态数组
void delete2DArray(int** array, int rows) {
    for (int i = 0; i < rows; ++i) {
        delete[] array[i];
    }
    delete[] array;
}
 
// 初始化二维数组
void initialize2DArray(int** array, int rows, int cols) {
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            array[i][j] = i * cols + j + 1;
        }
    }
}
 
// 打印二维数组
void print2DArray(int** array, int rows, int cols) {
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            std::cout << array[i][j] << "\t";
        }
        std::cout << std::endl;
    }
}
 
int main() {
    int rows, cols;
    std::cout << "请输入行数和列数: ";
    std::cin >> rows >> cols;
    
    // 创建二维动态数组
    int** matrix = create2DArray(rows, cols);
    
    // 初始化
    initialize2DArray(matrix, rows, cols);
    
    // 打印
    std::cout << "二维动态数组内容:" << std::endl;
    print2DArray(matrix, rows, cols);
    
    // 修改某个元素
    matrix[1][1] = 999;
    std::cout << "修改matrix[1][1]后:" << std::endl;
    print2DArray(matrix, rows, cols);
    
    // 释放内存
    delete2DArray(matrix, rows);
    
    return 0;
}

方法二:使用一维数组模拟二维数组

#include <iostream>
#include <memory>
 
class Matrix {
private:
    std::unique_ptr<int[]> data;
    int rows, cols;
    
public:
    Matrix(int r, int c) : rows(r), cols(c) {
        data = std::make_unique<int[]>(rows * cols);
    }
    
    // 重载()运算符实现二维访问
    int& operator()(int row, int col) {
        return data[row * cols + col];
    }
    
    const int& operator()(int row, int col) const {
        return data[row * cols + col];
    }
    
    // 获取行数和列数
    int getRows() const { return rows; }
    int getCols() const { return cols; }
    
    // 初始化矩阵
    void initialize() {
        for (int i = 0; i < rows; ++i) {
            for (int j = 0; j < cols; ++j) {
                (*this)(i, j) = i * cols + j + 1;
            }
        }
    }
    
    // 打印矩阵
    void print() const {
        for (int i = 0; i < rows; ++i) {
            for (int j = 0; j < cols; ++j) {
                std::cout << (*this)(i, j) << "\t";
            }
            std::cout << std::endl;
        }
    }
    
    // 矩阵转置
    Matrix transpose() const {
        Matrix result(cols, rows);
        for (int i = 0; i < rows; ++i) {
            for (int j = 0; j < cols; ++j) {
                result(j, i) = (*this)(i, j);
            }
        }
        return result;
    }
};
 
int main() {
    int rows, cols;
    std::cout << "请输入矩阵的行数和列数: ";
    std::cin >> rows >> cols;
    
    // 创建矩阵对象
    Matrix matrix(rows, cols);
    
    // 初始化
    matrix.initialize();
    
    std::cout << "原始矩阵:" << std::endl;
    matrix.print();
    
    // 修改元素
    matrix(0, 0) = 100;
    std::cout << "修改matrix(0,0)后:" << std::endl;
    matrix.print();
    
    // 转置矩阵
    Matrix transposed = matrix.transpose();
    std::cout << "转置矩阵:" << std::endl;
    transposed.print();
    
    return 0;
}

方法三:使用 std::vectorstd::vector(最推荐)

#include <iostream>
#include <vector>
#include <iomanip>
 
class VectorMatrix {
private:
    std::vector<std::vector<int>> matrix;
    
public:
    VectorMatrix(int rows, int cols) : matrix(rows, std::vector<int>(cols)) {}
    
    // 访问元素
    int& operator()(int row, int col) {
        return matrix[row][col];
    }
    
    const int& operator()(int row, int col) const {
        return matrix[row][col];
    }
    
    // 获取维度
    int rows() const { return matrix.size(); }
    int cols() const { return matrix.empty() ? 0 : matrix[0].size(); }
    
    // 初始化
    void initialize() {
        for (int i = 0; i < rows(); ++i) {
            for (int j = 0; j < cols(); ++j) {
                matrix[i][j] = i * cols() + j + 1;
            }
        }
    }
    
    // 随机初始化
    void randomInitialize() {
        for (int i = 0; i < rows(); ++i) {
            for (int j = 0; j < cols(); ++j) {
                matrix[i][j] = rand() % 100;
            }
        }
    }
    
    // 打印矩阵
    void print() const {
        for (const auto& row : matrix) {
            for (int element : row) {
                std::cout << std::setw(4) << element;
            }
            std::cout << std::endl;
        }
    }
    
    // 添加行
    void addRow(const std::vector<int>& newRow) {
        if (newRow.size() == cols()) {
            matrix.push_back(newRow);
        }
    }
    
    // 添加列
    void addColumn(int value = 0) {
        for (auto& row : matrix) {
            row.push_back(value);
        }
    }
    
    // 矩阵加法
    VectorMatrix operator+(const VectorMatrix& other) const {
        if (rows() != other.rows() || cols() != other.cols()) {
            throw std::invalid_argument("矩阵维度不匹配");
        }
        
        VectorMatrix result(rows(), cols());
        for (int i = 0; i < rows(); ++i) {
            for (int j = 0; j < cols(); ++j) {
                result(i, j) = (*this)(i, j) + other(i, j);
            }
        }
        return result;
    }
    
    // 查找最大值
    int findMax() const {
        int maxVal = matrix[0][0];
        for (const auto& row : matrix) {
            for (int element : row) {
                if (element > maxVal) {
                    maxVal = element;
                }
            }
        }
        return maxVal;
    }
    
    // 计算行和
    std::vector<int> rowSums() const {
        std::vector<int> sums;
        for (const auto& row : matrix) {
            int sum = 0;
            for (int element : row) {
                sum += element;
            }
            sums.push_back(sum);
        }
        return sums;
    }
};
 
int main() {
    int rows, cols;
    std::cout << "请输入矩阵的行数和列数: ";
    std::cin >> rows >> cols;
    
    // 创建矩阵
    VectorMatrix matrix1(rows, cols);
    VectorMatrix matrix2(rows, cols);
    
    // 初始化
    matrix1.initialize();
    matrix2.randomInitialize();
    
    std::cout << "矩阵1:" << std::endl;
    matrix1.print();
    
    std::cout << "\n矩阵2 (随机):" << std::endl;
    matrix2.print();
    
    // 矩阵运算
    try {
        VectorMatrix sum = matrix1 + matrix2;
        std::cout << "\n矩阵相加结果:" << std::endl;
        sum.print();
        
        // 统计信息
        std::cout << "\n矩阵1的最大值: " << matrix1.findMax() << std::endl;
        
        auto rowSums = matrix1.rowSums();
        std::cout << "矩阵1各行和: ";
        for (int sum : rowSums) {
            std::cout << sum << " ";
        }
        std::cout << std::endl;
        
        // 动态添加行和列
        matrix1.addColumn(999);
        std::vector<int> newRow(matrix1.cols(), 888);
        matrix1.addRow(newRow);
        
        std::cout << "\n添加行和列后的矩阵1:" << std::endl;
        matrix1.print();
        
    } catch (const std::exception& e) {
        std::cout << "错误: " << e.what() << std::endl;
    }
    
    return 0;
}

动态数组的最佳实践

内存管理工具类

#include <iostream>
#include <memory>
#include <stdexcept>
 
template<typename T>
class DynamicArray {
private:
    std::unique_ptr<T[]> data;
    size_t size_;
    size_t capacity_;
    
public:
    // 构造函数
    explicit DynamicArray(size_t initialSize = 0) 
        : size_(initialSize), capacity_(initialSize > 0 ? initialSize : 1) {
        data = std::make_unique<T[]>(capacity_);
    }
    
    // 拷贝构造函数
    DynamicArray(const DynamicArray& other) 
        : size_(other.size_), capacity_(other.capacity_) {
        data = std::make_unique<T[]>(capacity_);
        for (size_t i = 0; i < size_; ++i) {
            data[i] = other.data[i];
        }
    }
    
    // 赋值运算符
    DynamicArray& operator=(const DynamicArray& other) {
        if (this != &other) {
            size_ = other.size_;
            capacity_ = other.capacity_;
            data = std::make_unique<T[]>(capacity_);
            for (size_t i = 0; i < size_; ++i) {
                data[i] = other.data[i];
            }
        }
        return *this;
    }