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);
}
相关拓展可参考: