正确的方法来填充通过引用传递的向量

时间:2014-03-29 21:25:44

标签: c++ c++11 vector

假设您正在实现一个函数,该函数接收对要填充的向量的引用:

func(std::vector <T> & vec) { ...

现在,该功能将调整大小并填充此向量,但我们实际上并不知道该向量在其内部具有什么,或者它的容量是什么。为了真正安全,可以写:

vec.clear(); 
vec.resize(...); 
vec.shrink_to_fit();

这是否真的有必要,还是有更好的方法来做到这一点?

3 个答案:

答案 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 。两者基本相同且安全。