矢量参考究竟是什么

What exactly is a vector reference?

本文关键字:是什么 究竟 参考      更新时间:2023-10-16

如果函数接受参数vector<int>&,这到底意味着什么?这与表示向量中包含的指针的值相同吗?我完全理解vector<int&>;只是关于&在外面的一些事情让我绊倒了。

vector<int>&是一个向量的引用,vector<int&>是int引用的向量,实际上vector<int&>根本不会编译,更详细:为什么可以';我不做一个参考向量吗?

如果没有&,矢量的副本将传递给函数
=所有元素的副本。更改/插入/删除。。。不会影响原始矢量
(如果你有一个指针向量或类似的东西,它们仍然会指向同一个东西,但指针本身也会被复制(。

使用&,您将在函数中拥有相同的矢量,所有修改也将在外部可见。此外,如果不必要的话,不复制所有内容可能会更快(可能是因为整个move语义&co主题(。

它是一个引用,其中被引用的对象的类型为vector<int>

除了类型之外,这与任何其他引用都是一样的。如果你不熟悉引用,它们是为同一变量提供多个标签的一种方式:

int a = 5;
int &b = a;
// now "a" and "b" are both labels for the same variable. any
// expression involving `a` can have that exchanged for `b`
// without making any difference.
a = 6;
std::cout << b << std::endl;   // 6

在您谈论的情况下:

 void func( vector<int> &b ) { b.push_back(6); }
 int main()
 {
      vector<int> a;
      func(a);
      std::cout << a[0] << std::endl;     // 6
 }

则意味着CCD_ 10和CCD_。

我完全理解vector<int&>

vector<int&>是非法的,所以希望你对此的"完全理解"是非法的。不可能有引用的数组或容器。

当一个函数接受一个"vector&"时,它被称为通过引用传递。假设您的向量参考参数命名为vec。假设您希望将0赋给int向量中的所有元素。您可以键入:

int assign_zero(vector<int> vec){
    for(auto &x : vec){
    x = 0;
    }
}

有了这个,你可以在你的主要方法中键入这样的东西:

originalVector = assign_zero(originalVector);

您也可以在函数中使用对向量的引用来完成同样的事情(请注意,该函数现在是无效的(:

void assign_zero(vector<int>& vec){
    for(auto &x : vec){
    x = 0;
    }
}

现在,函数assign_zero((直接修改向量,而不是从内存中的originalVector创建一个新的零向量,然后将其分配回originalVector。这允许您使用这样的函数调用,其中没有创建额外的向量:

assign_zero(originalVector);

请注意,具有向量引用的函数不需要为void。