2014-04-28 157 views
0
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循环内正常运行。不知何故,当我使用print.size()打印出来时,它始终为0.是否保留不分配任何空间?指定矢量大小vs保留矢量大小

+0

最后一个问题是一个非限制性问题。是的,'reserve'分配空间,但不会在容器中创建元素。 –

+0

当我们不知道大多数变量的类型时,尝试跟随代码有点难。 – PlasmaHH

回答

3

它被指定为

void reserve(size_type n);

效果:,通知在尺寸的变更预定的 矢量,以便它可以相应地管理存储 分配A指令。在reserve()之后,如果重新分配发生,capacity()更大或等于reserve的参数;并等于 之前的capacity()的值,否则。当且仅当当前容量小于reserve()的参数 时,在此点重新分配 。如果除非由非CopyInsertable类型的移动构造函数引发异常 ,则不会有效果。

复杂度:它不会改变序列的大小,并且在序列大小的最大线性时间中取值为 。

所以,是的,它分配内存,但它不会在容器内创建任何对象。为了在随后想要的矢量中创建尽可能多的元素,并且能够通过op[]访问它们,您需要致电resize()

reserve()适用于当您想要防止类似于矢量重新分配之类的事情时不时地做大量push_back() s。

2

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

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

resize,实际上创造空间。还要注意,调整大小会将你的元素初始化为它们的默认值(所以对于一个int,它将设置每个元素为0)。实际上,当你说reserve(1000)时,那么vector实际上可能会为1000多个元素分配空间。如果发生这种情况,并且您存储了1000个元素,则未使用的空间将保持未使用状态(不会解除分配)。

2

它是语义之间增加载体(resize/assign/push_back /等)的大小,并且物理创造更多底层内存为它扩展成(reserve)之差。

,你看到你的代码甚至出现与reserve工作仅仅是因为你没有触发任何操作系统内存错误(因为内存是属于你的载体),而是因为你没有看到任何错误消息或崩溃并不意味着你的代码是安全或正确的:就矢量而言,你正在写入属于的内存,而不是你。

如果您使用.at()而不是[]您会遇到异常; 原样,您只是调用未定义的行为