分配矢量大小与保留矢量大小

时间:2014-04-28 09:15:58

标签: c++ vector

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;

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

3 个答案:

答案 0 :(得分:3)

指定为

  

void reserve(size_type n);

     

效果:通知a。的指令   矢量计划的大小变化,以便它可以管理存储   相应的分配。在reserve()之后,capacity()更大或   如果重新分配发生,则等于储备的参数;等于   否则为capacity()的先前值。重新分配发生在   这一点当且仅当当前容量小于   reserve()的参数。如果是例外   

,除了非CopyInsertable类型的移动构造函数之外,它被抛出。

     

复杂性:它不会改变序列的大小并占用   最大线性时间的序列大小。

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

reserve()适用于您希望在执行大量push_back()时不时阻止矢量重新分配等事项。

答案 1 :(得分:2)

reserve分配空间,但并不真正创造任何东西。它用于避免重新分配。

例如,如果您打算通过push_back将10000个元素存储到向量中,您可能会使向量使用重新分配。如果你在实际存储你的元素之前使用reserve,那么向量准备好接受大约10000个元素,因此他准备好了,并且向量的填充将比你没有使用reserve更快地填充。

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

PS - 事实上,当你说保留(1000)时,矢量实际上可以为超过1000个元素分配空间。如果发生这种情况并且您准确存储了1000个元素,那么未使用的空间将保持未使用状态(未解除分配)。

答案 2 :(得分:2)

在语义上增加向量的大小(resize / assign / push_back / etc)与物理创建更多底层内存以使其扩展为({ {1}})。

你看到你的代码似乎与reserve一起工作只是因为你没有触发任何操作系统内存错误(因为内存属于你的向量),但仅仅因为你没有&#39;看到任何错误消息或崩溃并不意味着您的代码是安全或正确的:就向量而言,您正在写入属于 it 的内存而不是您。

如果您使用reserve代替.at(),则您会遇到异常; 就是这样,你只是在调用未定义的行为