c++ vector二维数组的定义和插入 固定和可变大小

本文详细介绍如何在C++和Java中定义并操作二维数组,包括固定大小和可变大小的数组,展示了如何使用vector在C++中创建二维数组,并在Java中实现类似功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++:
固定大小:

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

int main()
{
    int row, column;
    cin >> row >> column;

    //key code:申请空间  
    vector<vector<int> > a(row, vector<int>(column));


    //使用空间  
    for (int j = 0; j < row; j++)
        for (int k = 0; k < column; k++)
            a[j][k] = rand() % 100;

    for (int j = 0; j < row; j++)
    {
        cout << endl;
        for (int k = 0; k < column; k++)
        {
            a[j][k] = rand() % 100;
            cout << a[j][k] << "     ";
        }
    }

    return 0;

}

可变大小:

#include<iostream>
#include<vector>
using namespace std;
 
void main()
{
	int r = 0, c = 0;
	cout << "Enter r: ";//规定二维数组行数
	cin >> r;
	cout << "Enter c: ";//规定二维数组列数
	cin >> c;
 
	vector<vector<int>>array;//定义二维数组
	vector<int>v;//定义一维数组
	array.clear();//将二维数组清空,或初始化(初始化代码很简单,不会可以百度)//也可不用这一步
	int temp=0;
	for (int i = 0; i < r; i++)//输入r*c的二维数组
	{
		v.clear();//子数组返回时要清除
		for (int j = 0; j < c; j++)
		{
			cin >> temp;
			v.push_back(temp);
 
		}
		array.push_back(v);
	}
 
	for (int i = 0; i < r; i++)//打印输入的二维数组
	{
		for (int j = 0; j < c; j++)
		{
			cout << array[i][j] << " ";
 
		}
		printf("\n");
	}
	while (1);
}

从vector<vector>array中获取行数和列数:

//行数
array.size();
//列数
array[0].size();

JAVA:

public class text {
    public static void contextLoads(int[][] a) {
        int rows=a.length;
        int cols=a[2].length;
        int[][]  b=new int[rows][cols];
        System.out.println(rows+"-"+cols);
    }

    public static void main(String[] args) {
        int[][] a=new int[5][3];
        contextLoads(a);
    }
}

转自https://blog.youkuaiyun.com/zmy_666/article/details/88069965?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159665164719725219961367%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=159665164719725219961367&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v3~pc_rank_v2-2-88069965.first_rank_ecpm_v3_pc_rank_v2&utm_term=%E7%94%A8vector%E5%AE%9A%E4%B9%89%E4%BA%8C%E7%BB%B4%E6%95%B0%E7%BB%84&spm=1018.2118.3001.4187

转自https://blog.youkuaiyun.com/weixin_30781433/article/details/97286318?biz_id=102&utm_term=%E7%94%A8vector%E5%AE%9A%E4%B9%89%E4%BA%8C%E7%BB%B4%E6%95%B0%E7%BB%84&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-3-97286318&spm=1018.2118.3001.4187

<think>首先,用户的问题是关于C++中正确定义二维数组的方法。我需要基于提供的引用系统指令来回答。 关键引用: - 引用[1]:讨论了三种方法定义二维数组:使用一维数组模拟、指针数组、以及连续内存的指针数组。 - 引用[2]:提到二维数组作为参数传递时的问题,强调需要指定列数。 - 引用[3]:展示了动态定义二维数组的方法。 - 引用[4]:关于初始化二维数组时避免警告的正确方式。 系统指令: - 所有行内数学表达式用$...$。 - 独立公式用$$...$$并单独成段。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾添加引用标识。 - 回答结构清晰,逐步解决问题。 用户意图:了解如何在C++中正确定义使用二维数组。 我的回答结构: 1. **介绍**:简要说明二维数组C++中的重要性。 2. **定义方法**: - 静态定义固定大小)。 - 动态定义(运行时大小)。 - 作为函数参数传递。 3. **示例代码**:提供代码片段来演示每种方法。 4. **常见问题**:基于引用,解释常见错误解决方案。 5. **总结**:推荐最佳实践。 6. **相关问题**:生成相关问题。 确保LaTeX语法正确: - 行内数学表达式:如$int$类型,$char$数组。 - 独立公式:可能不需要,除非有数学公式。 添加引用: - 在引用内容末尾加[^1], [^2]等。 生成相关问题: - 基于主题,提出相关问题。 最终回答: - 用中文。 - 清晰、可靠。</think>### C++中正确定义二维数组的方法 在C++中,二维数组是存储表格数据(如矩阵)的常用结构。正确使用二维数组需要理解其内存布局、定义方式常见陷阱。以下基于关键引用,逐步介绍静态定义、动态定义、参数传递等方法,并提供代码示例。所有方法都遵循C++标准语法,确保内存安全效率。 #### 1. **静态定义二维数组固定大小)** 当数组大小在编译时已知时,可以使用静态定义。这种方式简单高效,但大小不可变。初始化时需使用嵌套花括号以避免编译器警告。 - **语法**: ```cpp // 正确初始化:使用嵌套花括号 int matrix[行数][列数] = {{元素1, 元素2, ...}, {元素3, 元素4, ...}, ...}; ``` - **示例**: ```cpp #include <iostream> using namespace std; int main() { // 定义4x4矩阵,正确初始化避免警告 int matrix[4][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}}; cout << matrix[0][0]; // 输出:1 return 0; } ``` - 如果省略嵌套花括号(如`int matrix[4][4] = {1,2,8,9,...}`),编译器可能发出警告,因为初始化器不完整[^4]。 - **优点**:内存连续,访问速度快。 - **缺点**:大小固定,不适用于运行时动态数据。 #### 2. **动态定义二维数组(运行时大小)** 当数组大小在运行时确定时,需使用动态内存分配。这避免了静态数组的固定大小限制,但需手动管理内存以防止泄漏。 - **方法1:使用指针数组(非连续内存)** - 语法:先分配行指针数组,再为每行分配列内存。 - 示例: ```cpp #include <iostream> using namespace std; int main() { int a, b; cout << "输入行数列数: "; cin >> a >> b; // 动态分配 int **array = new int*[a]; // 分配行指针数组 for (int i = 0; i < a; i++) { array[i] = new int[b]; // 为每行分配列内存 } // 使用:array[i][j] = 值; array[0][0] = 10; cout << array[0][0]; // 输出:10 // 释放内存 for (int i = 0; i < a; i++) { delete[] array[i]; // 先释放每行 } delete[] array; // 再释放行指针数组 return 0; } ``` - 此方法内存不连续,但访问语法直观(`array[i][j]`)[^3]。 - **优点**:灵活支持任意大小。 - **缺点**:内存碎片化,需手动释放。 - **方法2:使用一维数组模拟(连续内存)** - 语法:分配一个一维数组,通过索引计算模拟二维访问。 - 示例: ```cpp #include <iostream> using namespace std; int main() { int a, b; cout << "输入行数列数: "; cin >> a >> b; // 动态分配连续内存 int *array = new int[a * b]; // 一维数组 int **array2 = new int*[a]; // 辅助指针数组,便于使用二维语法 for (int i = 0; i < a; i++) { array2[i] = array + i * b; // 指向每行起始位置 } // 使用:array2[i][j] = 值; array2[0][0] = 20; cout << array2[0][0]; // 输出:20 // 释放内存(先释放辅助指针,再释放一维数组) delete[] array2; delete[] array; return 0; } ``` - 此方法内存连续,访问效率高,且兼容二维语法[^1]。 - **优点**:内存局部性好,适合高性能计算。 - **缺点**:索引计算稍复杂。 #### 3. **二维数组作为函数参数传递** 当二维数组传递给函数时,必须指定列数或使用指针,否则编译器无法推断内存布局。 - **语法**: - 固定列数:`void func(int arr[][列数], int rows)` - 使用指针:`void func(int (*arr)[列数], int rows)` 或 `void func(int **arr, int rows, int cols)` - **示例**: ```cpp #include <iostream> #include <cstring> // 用于strlen using namespace std; // 函数:处理二维数组固定列数) void printMatrix(int arr[][100], int rows) { for (int i = 0; i < rows; i++) { for (int j = 0; j < 100; j++) { cout << arr[i][j] << " "; } cout << endl; } } int main() { int matrix[2][100] = {{1,2}, {3,4}}; printMatrix(matrix, 2); // 正确传递 return 0; } ``` - 错误示例:如果未指定列数(如`void func(int arr[][])`),编译器会报错,因为二维数组存储是行优先连续布局,需列数计算偏移[^2]。 - 动态数组传递:使用指针参数(如`void func(int **arr, int rows, int cols)`)。 #### 4. **常见问题与解决** - **问题1:初始化警告** - 原因:静态初始化时缺少嵌套花括号。 - 解决:始终使用`{{...}, {...}}`格式[^4]。 - **问题2:参数传递错误** - 错误消息:如“无法将 int (*)[3] 转换为 int (*)[100]”。 - 解决:在函数参数中显式指定列数(如`int arr[][100]`)[^2]。 - **问题3:内存泄漏** - 原因:动态分配后未正确释放。 - 解决:按顺序释放内存(先释放行,再释放指针数组)[^3]。 #### 总结 - **静态数组**:适合固定大小场景,初始化时用嵌套花括号。 - **动态数组**:优先使用连续内存方法(方法2)以提高性能;非连续方法(方法1)更易编码。 - **参数传递**:始终指定列数或使用指针。 - **最佳实践**:在C++11及以上,推荐使用`std::vector`替代原生数组以简化内存管理,但理解原生二维数组对底层编程至关重要。 正确使用二维数组能优化数据处理效率,避免常见错误如内存泄漏或编译器警告[^1][^2][^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值