C++ 分配向量大小与保留向量大小 bigvalue\t结果; 结果.赋值(left.size()+right.size(),0); 整数进位=0; 对于(size_t i=0;i

C++ 分配向量大小与保留向量大小 bigvalue\t结果; 结果.赋值(left.size()+right.size(),0); 整数进位=0; 对于(size_t i=0;i,c++,vector,C++,Vector,在这里,我使用assign来分配结果的大小,结果通常会传回。 当我使用result.reserve(left.size()+right.size());,该函数在两个for循环内正常运行。不知怎的,当我使用print out the result.size()时,它总是0。reserve不分配任何空间吗?分配空间,但实际上不创建任何东西。它用于避免重新分配 例如,如果您打算存储10000个元素,通过将_推回向量,您可能会使向量使用重新分配。如果在实际存储元素之前使用reserve,那么向量准备接

在这里,我使用assign来分配结果的大小,结果通常会传回。 当我使用result.reserve(left.size()+right.size());,该函数在两个for循环内正常运行。不知怎的,当我使用print out the result.size()时,它总是0。reserve不分配任何空间吗?

分配空间,但实际上不创建任何东西。它用于避免重新分配

例如,如果您打算存储10000个元素,通过将_推回向量,您可能会使向量使用重新分配。如果在实际存储元素之前使用reserve,那么向量准备接受大约10000个元素,因此他准备好了,向量的填充速度将比不使用reserve时更快

,实际上创造了空间。还要注意,resize会将元素初始化为它们的默认值(因此对于int,它会将每个元素都设置为0)

实际上,当你说reserve(1000)时,向量实际上会为1000多个元素分配空间。如果发生这种情况,并且您正好存储了1000个元素,那么未使用的空间将保持未使用状态(不会取消分配)。

它被指定为

void reserve(大小\u类型n)

效果:通知用户的指令 向量的大小有计划的更改,以便它可以管理存储 相应地分配。在reserve()之后,capacity()大于或等于 等于发生再分配时的储备参数;等于 否则,将返回capacity()的上一个值。重新分配发生在 当且仅当当前容量小于 reserve()的参数。如果有例外 如果不是由非CopyInsertable类型的移动构造函数引发,则不会产生任何效果

复杂度:它不会改变序列的大小,并在 序列大小中的大多数线性时间

因此,是的,它分配内存,但不在容器中创建任何对象。要在向量中创建您以后想要的尽可能多的元素,并且能够通过
op[]
访问它们,您需要调用
resize()


reserve()
用于在执行大量的
push_-back()
s时防止向量重新分配之类的事情。

这是语义上增加向量大小(
resize
/
赋值
/
push_-back
/etc)之间的区别,并在物理上创建更多的底层内存,以便将其扩展到(
reserve

即使使用
reserve
也能看到代码正常工作,这仅仅是因为您没有触发任何操作系统内存错误(因为内存属于您的向量),但仅仅因为您没有看到任何错误消息或崩溃并不意味着您的代码是安全或正确的:就向量而言,你在写属于它的记忆,而不是你


如果您使用
.at()
而不是
[]
则会出现异常实际上,您只是在调用未定义的行为

最后一个问题是非序列。是的,
reserve
分配空间,但它不在容器中创建元素。当我们不知道大多数变量的类型时,尝试遵循代码有点困难。
bigvalue_t result;
result.assign(left.size() + right.size(), 0);
int carry = 0;
for(size_t i = 0; i < left.size(); i++) {
   carry = 0;
   for(size_t j = 0; j < right.size(); j++) {
      int sum = result[i+j] + (left[i]*right[j]) + carry;
      result[i+j] = sum%10;
      carry = sum/10;
   }
   result[i+right.size()] = carry;
}
return result;