欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

vector中的reserve和resize使用

程序员文章站 2022-03-01 22:16:45
...

记录一下使用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