C++ 动态数组和动态二维数组

1. 动态一维数组

使用 newdelete

#include <iostream>
using namespace std;

int main() {
    int n;
    cout << "输入数组大小: ";
    cin >> n;
    
    // 创建动态数组
    int *arr = new int[n];
    
    // 初始化数组
    for(int i = 0; i < n; i++) {
        arr[i] = i * 10;
    }
    
    // 使用数组
    for(int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;
    
    // 释放内存
    delete[] arr;
    
    return 0;
}

使用 vector(推荐)

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n;
    cout << "输入数组大小: ";
    cin >> n;
    
    // 创建动态vector
    vector<int> vec(n);
    
    // 初始化
    for(int i = 0; i < n; i++) {
        vec[i] = i * 10;
    }
    
    // 使用(多种方式)
    for(int i = 0; i < vec.size(); i++) {
        cout << vec[i] << " ";
    }
    cout << endl;
    
    // 自动释放内存,无需手动delete
    
    return 0;
}

2. 动态二维数组

方法一:使用指针数组(最常用)

#include <iostream>
using namespace std;

int main() {
    int rows, cols;
    cout << "输入行数和列数: ";
    cin >> rows >> cols;
    
    // 创建动态二维数组
    int **arr = new int*[rows];  // 创建行指针数组
    for(int i = 0; i < rows; i++) {
        arr[i] = new int[cols];  // 为每一行创建列数组
    }
    
    // 初始化
    for(int i = 0; i < rows; i++) {
        for(int j = 0; j < cols; j++) {
            arr[i][j] = i * 10 + j;
        }
    }
    
    // 使用
    for(int i = 0; i < rows; i++) {
        for(int j = 0; j < cols; j++) {
            cout << arr[i][j] << "\t";
        }
        cout << endl;
    }
    
    // 释放内存(重要!)
    for(int i = 0; i < rows; i++) {
        delete[] arr[i];  // 先释放每一行
    }
    delete[] arr;  // 再释放行指针数组
    
    return 0;
}

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

#include <iostream>
using namespace std;

int main() {
    int rows, cols;
    cout << "输入行数和列数: ";
    cin >> rows >> cols;
    
    // 创建连续内存的动态数组
    int *arr = new int[rows * cols];
    
    // 访问元素:arr[i][j] 相当于 arr[i * cols + j]
    for(int i = 0; i < rows; i++) {
        for(int j = 0; j < cols; j++) {
            arr[i * cols + j] = i * 10 + j;
        }
    }
    
    // 使用
    for(int i = 0; i < rows; i++) {
        for(int j = 0; j < cols; j++) {
            cout << arr[i * cols + j] << "\t";
        }
        cout << endl;
    }
    
    // 释放内存
    delete[] arr;
    
    return 0;
}

方法三:使用 vectorvector(最推荐)

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int rows, cols;
    cout << "输入行数和列数: ";
    cin >> rows >> cols;
    
    // 创建二维vector
    vector<vector<int>> vec(rows, vector<int>(cols));
    
    // 初始化
    for(int i = 0; i < rows; i++) {
        for(int j = 0; j < cols; j++) {
            vec[i][j] = i * 10 + j;
        }
    }
    
    // 使用
    for(int i = 0; i < rows; i++) {
        for(int j = 0; j < cols; j++) {
            cout << vec[i][j] << "\t";
        }
        cout << endl;
    }
    
    // 自动释放内存,无需手动管理
    
    return 0;
}

3. 不规则二维数组(每行长度不同)

#include <iostream>
using namespace std;

int main() {
    int rows;
    cout << "输入行数: ";
    cin >> rows;
    
    // 创建不规则二维数组
    int **arr = new int*[rows];
    
    // 为每一行分配不同大小的数组
    for(int i = 0; i < rows; i++) {
        int cols = i + 1;  // 第i行有i+1个元素
        arr[i] = new int[cols];
        
        // 初始化
        for(int j = 0; j < cols; j++) {
            arr[i][j] = (i + 1) * 10 + j;
        }
    }
    
    // 使用
    for(int i = 0; i < rows; i++) {
        int cols = i + 1;
        for(int j = 0; j < cols; j++) {
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }
    
    // 释放内存
    for(int i = 0; i < rows; i++) {
        delete[] arr[i];
    }
    delete[] arr;
    
    return 0;
}

4. 使用 vector 的不规则二维数组

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int rows;
    cout << "输入行数: ";
    cin >> rows;
    
    // 创建不规则的二维vector
    vector<vector<int>> vec;
    
    for(int i = 0; i < rows; i++) {
        int cols = i + 1;
        vector<int> row(cols);  // 创建当前行
        
        // 初始化
        for(int j = 0; j < cols; j++) {
            row[j] = (i + 1) * 10 + j;
        }
        
        vec.push_back(row);  // 添加到二维vector
    }
    
    // 使用
    for(int i = 0; i < vec.size(); i++) {
        for(int j = 0; j < vec[i].size(); j++) {
            cout << vec[i][j] << " ";
        }
        cout << endl;
    }
    
    return 0;
}

总结对比

new/delete

性能好,控制精细

需要手动管理内存,容易出错

性能要求高的场景

vector

自动内存管理,安全易用

稍有性能开销

大多数日常使用场景

一维模拟二维

内存连续,缓存友好

访问稍复杂

需要连续内存的场景

不规则数组

灵活,节省内存

管理复杂

每行数据量不同的场景

推荐:在日常编程中优先使用 vector,它更安全、更易用,只有在性能要求极高的场景下才考虑使用原始的 new/delete

全部评论

相关推荐

投递小米集团等公司10个岗位
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务