将本地 std::vector 分配给 C++ 中的引用

Posted

技术标签:

【中文标题】将本地 std::vector 分配给 C++ 中的引用【英文标题】:Assigning local std::vector to reference in C++ 【发布时间】:2017-04-07 04:34:44 【问题描述】:

我不确定我的方法是否正确。 因为我通过引用Function 传递向量v,所以在它的执行之后向量的内容会改变。

如果我不能直接处理向量 v 并决定使用临时向量 temp 怎么办。通过v = temp 分配给v 我的临时地址是否正确?不会引用v 指向在执行Function 后将被清除的内存?

void Function(std::vector<bool> &v) 
  std::vector<bool> temp(v.size(), false);

  // some operations on vector temp
  // ...

  v = temp;

【问题讨论】:

【参考方案1】:

不会引用v 指向在执行Function 后将被清除的内存吗?

没有。对于v = temp;v 是从temp 分配的副本。那么v将包含与temp相同的内容,但与temp无关; temp 是本地对象,稍后会被销毁,但传入的参数不受影响。

顺便说一句:由于temp 是一个本地对象,在退出函数时将被销毁,因此从中复制可能效率低下。你可以离开它:

v = std::move(temp);

【讨论】:

编译器优化不会自动生成移动而不是复制,因为 temp 直接超出范围? @A.S.H 可能,也可能不会。标准没有提到这种优化,它不能保证,也不能移植。所以还是自己动手做比较靠谱。 如果我在Function 结束后尝试使用v,它不应该是不安全的,因为v 指向temptemp 不再存在。它会是任何如果使用指针而不是引用,则不同。 @GauravSehgal 否。指针与引用不同。分配引用时,您分配的是引用指向的变量的值,而不是引用本身。另一方面,您不能重新绑定对其他变量的引用。例如int i = 0; int j = 1; int&amp; r = i; r = j; j = 2; 那么ri 的值都是1,但是r 仍然绑定到i,而不是j @songyuanyao 知道了。非常感谢。【参考方案2】:

是的,分配 v = temp 是安全的。有关更多信息,请查看例如:https://isocpp.org/wiki/faq/references#overview-refs

【讨论】:

以上是关于将本地 std::vector 分配给 C++ 中的引用的主要内容,如果未能解决你的问题,请参考以下文章

将 std::vector 分配给 std::valarray

C++ 动态分配的 std::vector

如何在 C++ 中随机分配给向量?

C++ STD 容器:std::vector - 有没有办法清除向量并保留存储分配?

Swig:将 std::vector<unsigned char> 传递给从 c++ 生成的 c# 函数

C++ 向量分配器错误