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.保留不分配任何空格吗?
答案 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()
,则您会遇到异常; 就是这样,你只是在调用未定义的行为。