使用vector遇到的一些问题以及解决

文章讲述了在C++项目中,使用vector作为类Box的初始化参数时遇到段错误的问题。作者分析了可能的原因,包括非法访问、数组大小和未初始化的类内数组,最终通过`resize()`函数解决了初次问题。然而,后续发现传入空数组时仍会出错,通过添加空值检查解决了这一新问题。
摘要由CSDN通过智能技术生成

问题出现:

在项目包里,需要用到vector容器作为另一个类的初始化参数之一

简化如下:

//存在一个类(这里简写了)
class Box{
public:
    Box(int k, vector<double>& num);
    vector<vector<double>> Num_box;
};

//构造函数如下:
Box::Box(int k, vector<double>& num){
    
    	for (int i = 0; i < num.size(); i++)
        {
	        dataSet[i].push_back(num[i]);
        }
        colLen = dataSet[0].size();
	    rowLen = dataSet.size();

}

调用类对象来构造:

vector<double> v;
int a = 3;
Box box(3, &v);

编译通过,运行出现段错误。

后来经过cout大法,定位到错误在:

dataSet[i].push_back()这里。

查找问题:

经过一番苦寻,找到了可能出现的几个问题:1. 考虑到可能是vector非法访问导致的段错误;2. 传入数组的空间过大导致的问题;3. 也是真实存在的问题:类内数组没有初始化!

问题解决:

第一个问题没有考虑,因为访问过程都是在vector内部实现的;

第二个问题,经过调试发现,数组包含60个double类型的数据,因此排除该问题

第三个问题以及解决:

//修改后的构造函数如下:
Box::Box(int k, vector<double>& num){
        dataSet.resize(num.size());
    	for (int i = 0; i < num.size(); i++)
        {
	        dataSet[i].push_back(num[i]);
        }
        colLen = dataSet[0].size();
	    rowLen = dataSet.size();

}

使用resize()函数提前预留空间,这样就能很好地解决问题。

新问题:

但是后续在使用的过程中,偶尔还会出现一些问题:

当传入数组为空时,出现段错误。。。所以直接使用if函数,把这种情况剔除即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值