假设您正在实现一个函数,该函数接收对要填充的向量的引用:
func(std::vector <T> & vec) { ...
现在,该功能将调整大小并填充此向量,但我们实际上并不知道该向量在其内部具有什么,或者它的容量是什么。为了真正安全,可以写:
vec.clear();
vec.resize(...);
vec.shrink_to_fit();
这是否真的有必要,还是有更好的方法来做到这一点?
答案 0 :(得分:3)
只要你要覆盖每个元素(或者不要忘记未被触及的元素是垃圾),你就不需要在调整大小之前清除向量。例外情况是,如果要使用为调整大小提供的默认值填充整个向量,在这种情况下,您需要清除它。
通常,您通过引用传递向量,以利用现有的保留容量来节省内存分配。使用shrink_to_fit
会失败这个目的,因为向量容量可以上下变化(如果编译器为缩小做了任何事情)。如果要最小化内存,请按值返回新矢量。
答案 1 :(得分:0)
如果您不关心以前的内容,只需按值返回,您将在新变量上复制省略并移动语义。
std::vector <T> func();
// later
auto vec = func(); // will use copy elision and Return Value Optimisation
existingVec = func(); // move semantic, previous content will be released and new one will be steal from the temporary
如果你关心以前的内容,或者至少想要阻止动态分配,如果以前的阵列容量足够,resize
就足够了
答案 2 :(得分:0)
实现一个接收对向量的引用的函数 待填补
您可以在 func 内部和 std :: vector 实际创建的函数内部编写的逻辑之间没有区别,并将其作为对 FUNC 。两者基本相同且安全。