C++ 动态数组和动态二维数组
1. 动态一维数组
使用 new
和 delete
#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; }
方法三:使用 vector
的 vector
(最推荐)
#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; }
总结对比
| 性能好,控制精细 | 需要手动管理内存,容易出错 | 性能要求高的场景 |
| 自动内存管理,安全易用 | 稍有性能开销 | 大多数日常使用场景 |
一维模拟二维 | 内存连续,缓存友好 | 访问稍复杂 | 需要连续内存的场景 |
不规则数组 | 灵活,节省内存 | 管理复杂 | 每行数据量不同的场景 |
推荐:在日常编程中优先使用 vector
,它更安全、更易用,只有在性能要求极高的场景下才考虑使用原始的 new/delete
。