回收未使用的矢量

时间:2011-08-23 11:27:45

标签: c++ vector

我在程序中定义了一个向量,如下所示:

vector<bool> isPrime (limit + 1, false);

其中limit是int。稍后在程序中,我想回收矢量,保留名称,但缩小尺寸并用false填充所有元素。

我尝试过使用

vector<bool> isPrime (otherLimit + 1, false);

以同样的方式重新定义intcharstring,但会返回错误,因为我没有使用new实例化它算子,我不能delete旧的。我已经能够手动调整它并使用for循环将每个元素转换为false,但这对我来说似乎相当笨拙。

是否有更简单的方法来回收载体?我希望在可读性方面保持名称相同。

6 个答案:

答案 0 :(得分:5)

你可以

isPrime = vector<bool>(otherLimit + 1, false)

或使用其成员clearresize

isPrime.clear();
isPrime.resize(otherLimit + 1, false);

答案 1 :(得分:2)

您可以使用复制赋值运算符,如果您希望减少空间消耗,可以使用成员函数shrink_to_fit():

isPrime = vector<bool>(otherLimit+1, false);
isPrime.shrink_to_fit()

或者,如果您使用的是C ++ 0x,则移动赋值运算符:

isPrime = std::move(vector<bool>(otherLimit+1, false));
编辑:正如大卫指出的那样,编译器会将临时值识别为右值并且仍然使用右值引用,因此std::move是不必要的,以下就足够了(并且方便地与C ++ 03兼容)和C ++ 0x编译器,虽然移动赋值只能在C ++ 0x中调用:

isPrime = vector<bool>(otherLimit+1, false);

这些都会调整矢量大小并将所有元素设置为false,但如果您有权访问它,则使用移动赋值运算符会更有效。

此外,如果您使用的是仅限C ++ 03的编译器,那么在这种情况下使用Davids .swap()惯用法比复制赋值更有效。

希望这有帮助!

编辑:回应大卫的帖子:http://ideone.com/wB77w

答案 2 :(得分:1)

您可以使用分配重置向量,就像您对int等所做的那样。

或者,您可以使用resize方法。

最后,我建议不要采用所有这些方法:不回收变量名称。仅将变量用于一个目的。为新变量使用新名称。

将变量名称视为仅标识一个实体。变量名称将实体绑定到当前范围(因此存在)。要创建新实体,请始终创建新的变量名称或新范围。

答案 3 :(得分:1)

有几个答案表明作业如下:

isPrime = std::vector<bool>(otherLimit+1,false);

虽然该解决方案可行,但可能并不完全符合您的要求。我建议您使用 swap-to-resize 技巧:

std::vector<bool>(otherLimit+1,false).swap( isPrime );

优点是内存将缩小至适合 otherLimit+1元素,并且它们将仅设置为false一次。在分配案例中,会在右侧创建第一个otherLimit+1元素并将其设置为false,然后将这些值复制到左侧isPrime向量...(I如果操作缩小向量,请不要记得我的头顶,但我对此表示怀疑,这意味着capacity()的{​​{1}}将是{{} 1}})

答案 4 :(得分:0)

使用赋值(=)运算符而不是构造函数:

isPrime = std::vector <bool> (otherLimit + 1, false)

答案 5 :(得分:0)

使用std::vector<..>::resize(..)调整其大小,std::fill(..)为所有元素设置特定值。