vector中的reserve和resize使用

记录一下使用vector中的reserve函数犯的错误,并总结下其和resize的区别。

定义了一个变量,并对vDefect进行简单的赋值操作,并使用C_uint.reserve(vDefectItem.size())开辟空间

struct sDefectItem
{
	unsigned int type;
	int x;
	int y;
	int width;
};

vector<sDefectItem> vDefect;
vector<sDefectItem> C_uint;

sDefectItem item;
item.type = 1;
item.width = 3;
item.x = 9;
item.y = 8;

vDefect.push_back(item);
C_uint.reserve(vDefectItem.size());    

 

在后期的运算中使用如下

for (j = 0; j < vDefect.size(); j++)
{
	C_uint.at(j).type = Modular_Exonentiation(vDefect.at(j).type, e1, n1);
	C_uint.at(j).width = Modular_Exonentiation(vDefect.at(j).width, e1, n1);
	C_uint.at(j).x = Modular_Exonentiation(vDefect.at(j).x, e1, n1);
	C_uint.at(j).y = Modular_Exonentiation(vDefect.at(j).y, e1, n1);
}

此时会出现std::out_of_range的错误,经查询发现

 (1)reserve是容器预留空间,但在空间内不真正创建元素对象,所以在没有添加新的对象之前,不能引用容器内的元素,即不能使用vector.at(i).xxx或者[ ]操作符。加入新的元素时,要调用push_back()/insert()函数。

(2)resize是改变容器的大小,且在创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。此时再调用push_back()函数,是加在这个新的空间后面的。

对上述错误的地方修改如下:

sDefectItem item;
for (j = 0; j < vDefect.size(); j++)
{
    item.type = Modular_Exonentiation(vDefect.at(j).type, e1, n1);
    item.width = Modular_Exonentiation(vDefect.at(j).width, e1, n1);
    item.x = Modular_Exonentiation(vDefect.at(j).x, e1, n1);
    item.y = Modular_Exonentiation(vDefect.at(j).y, e1, n1);

    C_uint.push_back(item);
}

相关拓展可参考:

https://blog.csdn.net/amusi1994/article/details/81106455

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值