【问题标题】:What exactly is a vector reference?究竟什么是矢量参考?
【发布时间】:2014-06-18 16:32:52
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    它是一个引用,被引用的对象的类型为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&lt;int&amp;&gt;

    vector&lt;int&amp;&gt; 是非法的,所以希望您对此的“完全理解”是它是非法的。不可能有引用的数组或容器。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 好吧...抱歉,忘记我说的了 :)
      【解决方案4】:

      当一个函数接受一个“向量&”时,它被称为通过引用传递。假设您的矢量参考参数名为 vec。假设您要将 0 分配给整数向量中的所有元素。您可以输入:

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

      有了这个,你可以在你的 main 方法中输入类似这样的东西:

      originalVector = assign_zero(originalVector);
      

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

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

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

      assign_zero(originalVector);
      

      请注意,带有矢量引用的函数不必为 void。

      【讨论】:

        猜你喜欢
        • 2011-08-27
        • 2017-04-25
        • 1970-01-01
        • 2014-10-28
        • 2012-08-27
        • 2010-11-12
        • 2011-03-18
        • 2011-01-22
        相关资源
        最近更新 更多