究竟什么是矢量参考?

时间:2014-05-02 04:04:43

标签: c++ vector reference pass-by-reference

如果函数接受参数vector<int>&,那究竟是什么意思?这与说出向量中包含的指针的值是一样的吗?我完全理解vector<int&>;关于&在外面的事情让我感到兴奋。

4 个答案:

答案 0 :(得分:1)

vector<int>&是对向量的引用,vector<int&>是int引用的向量,实际上vector<int&>根本不会编译,更详细: Why can't I make a vector of references?

答案 1 :(得分:0)

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

使用&,您在函数中将拥有相同的向量,并且所有修改也将在外部可见。另外,如果它不是nessecary,可能更快不复制所有内容(可能是因为整个移动语义和协议主题)。

答案 2 :(得分:0)

它是一个引用,其中引用的对象具有类型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
 }

这意味着ab都是同一向量的标签。

  

我完全理解vector<int&>

vector<int&>是非法的,所以希望您能够完全理解&#34;这是非法的。不可能有引用的数组或容器。

答案 3 :(得分:0)

当一个函数接受“vector&amp;”时据说通过引用传递。假设您的矢量引用参数名为vec。假设您要为整数向量中的所有元素指定0。您可以输入:

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创建新的零向量,然后将其分配回原始向量。这允许您使用这样的函数调用,其中不创建额外的向量:

assign_zero(originalVector);

请注意,带矢量引用的函数不需要为空。