vector怎么开二维数组以及遇到的问题

前言

  在写题开二维数组时,总是直接开很大,这样很浪费内存,习惯不好,所以之后开始使用vector。


一、vector怎么开二维?

1.vector<int> v[n];这样就开了一个具有n列,行数可变化的二维数组。但是这样行数还是不可变直接指定开好的还是会浪费空间,故而用第二种。
2.vector<vector<int>> v这样就开了一个行数和列数都可变换的二维数组。

二、如何使用

  

1.第一种

第一种很简单只要直接在指定行插入元素就行了。例如:

vector<int> v[5];
v[0].push_back(2);   //在一行尾部插入2;
v[0].push_back(3);   //在第一行尾部插入3;
v[1].push_back(1);   //在第二行尾部插入1;

2.第二种

第二种在刚开始使用时可能会遇到问题,再插入元素时会报错。例如:

vector<vector<int>> v;
有人直接
v.push_back(a);    //a是你要插入的数
或者
v[0].push_back(a);
这样编译器会直接报错。

  为什么呢?因为你创建的对象v里没有任何元素,里面目前是0行0列,而你用v[0].push_back(a);直接在下标为0的一行的尾部插入元素a;可问题是目前v里根本没有这一行。
  那这怎么办呢,我们要先插入一行空的vector<int>例如:

创建一个vector<int>类型
vector<int> p;
然后插入
v.push_back(p);
现在v里就有了第一行。
再插入:
v.push_back(p);
v里就有了第二行,现在就可以跟第一种用法一样,在指定行尾部添加元素。
v[0].push_back(a>;
简便写法
v.push_back(vector<int>());

还可以这样写
当题目告诉你要开一个n行m列的数组时,我们写可以这样,在创建时直接指定行数和列数。

vector<vector<int>> v(n,vector<int>());
这样就直接建立了一个n行的动态数组。
或者直接列数也直接指定让他先开好。
vector<vector<int>> v(n,vector<int>(m));
这样就直接开好了一个n行m列的动态数组。

结论

vector<vector<int>> v;开一个动态数组,得先插入行,再插入单个元素。
vector<vector<int>> v(n,vector<int>());直接开一个n行的动态数组
相当于直接插入了n行,可直接在指定行插入元素。
vector<vector<int>> v(n, vector<int>(m));直接开一个n行m列的动态数组,
可直接指定位置修改元素,不用挨个push_back()插入,方便简洁。
关于C++二维数组的最大长度,实际上并没有硬性的上限规定,而是受到系统内存限制。理论上,你可以根据系统的物理内存大小去创建足够大的二维数组。 在实际应用中,你需要考虑到以下几个因素来确定合理的数组尺寸: 1. **系统内存**:你的程序能够使用的最大内存取决于操作系统、运行环境和其他正在运行的应用所占的内存。通常,在64位操作系统上,单个进程可以访问大约16GB到8TB的内存(具体取决于系统配置和可用资源)。然而,由于其他因素如系统销和虚拟内存管理的影响,实际可用于数组的空间会小一些。 2. **应用程序需求**:如果你的任务需要处理非常大量的数据,那么就应当考虑使用更高效的数据结构或算法来减少所需内存。例如,如果只需要存储稀疏矩阵的一部分信息,那么使用稀疏矩阵表示法可能会比全维数组更节省空间。 3. **性能考量**:虽然理论上可以分配非常大的内存块,但在实际操作时可能会遇到性能瓶颈。过大的内存分配可能导致频繁的内存碎片化,影响垃圾回收效率;另外,对于大规模数据集的操作,CPU缓存的使用也会影响整体性能。 为了安全起见,并避免潜在的问题,建议在设计数组大小时采用一些策略: - 使用`std::vector<std::vector<T>>`而非固定大小的二维数组。`std::vector`可以在运行时动态地增加其容量,因此可以有效地管理数组的大小而不受限于预分配的内存量。 - 对于非常大的数组,考虑使用分布式内存计算框架,如Apache Spark,它们提供了一种管理大量数据集并行处理的方式。 - 谨慎考虑数据的存储方式以及访问模式。优化读取和写入操作,减少不必要的内存复制和频繁的大规模数据移动。 总之,虽然理论上没有对二维数组长度的明确限制,但实际上应基于实际需求、系统资源和性能目标合理规划数组的大小,以避免潜在的内存溢出、性能瓶颈等问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值