我在程序中定义了一个向量,如下所示:
vector<bool> isPrime (limit + 1, false);
其中limit是int
。稍后在程序中,我想回收矢量,保留名称,但缩小尺寸并用false
填充所有元素。
我尝试过使用
vector<bool> isPrime (otherLimit + 1, false);
以同样的方式重新定义int
,char
或string
,但会返回错误,因为我没有使用new
实例化它算子,我不能delete
旧的。我已经能够手动调整它并使用for
循环将每个元素转换为false,但这对我来说似乎相当笨拙。
是否有更简单的方法来回收载体?我希望在可读性方面保持名称相同。
答案 0 :(得分:5)
你可以
isPrime = vector<bool>(otherLimit + 1, false)
或使用其成员clear
和resize
:
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(..)
为所有元素设置特定值。