【问题标题】:Passing vector by reference通过引用传递向量
【发布时间】:2013-04-08 22:52:42
【问题描述】:

使用普通的 C 数组我会做这样的事情:

void do_something(int el, int **arr)
{
   *arr[0] = el;
   // do something else
}

现在,我想用向量替换标准数组,并在这里达到相同的结果:

void do_something(int el, std::vector<int> **arr)
{
   *arr.push_front(el); // this is what the function above does
}

但它显示“表达式必须具有类类型”。如何正确执行此操作?

【问题讨论】:

  • int **arr??如何直接分配二维数组?如果您需要二维数组,foo(vector&lt;vector&lt;int&gt; &gt; &amp;arr).
  • 我想他可能试图将指针传递给数组而不是二维数组..如果我错了请纠正我
  • 很多答案,但没有人注意到它是一个指针数组,而不是指向数组的指针。他们想要std::vector&lt;int*&gt;

标签: c++


【解决方案1】:

您可以通过引用传递容器,以便在函数中对其进行修改。其他答案没有解决的是std::vector 没有push_front 成员函数。您可以使用 vector 上的 insert() 成员函数进行 O(n) 插入:

void do_something(int el, std::vector<int> &arr){
    arr.insert(arr.begin(), el);
}

或者使用 std::deque 代替分期 O(1) 插入:

void do_something(int el, std::deque<int> &arr){
    arr.push_front(el);
}

【讨论】:

    【解决方案2】:

    如果您将函数定义为采用 std::vector&lt;int&gt;&amp; arr 和整数值的参数,那么您可以在该函数中使用 push_back

    void do_something(int el, std::vector<int>& arr)
    {
        arr.push_back(el);
        //....
    }
    

    用法:

    std::vector<int> arr;
    do_something(1, arr); 
    

    【讨论】:

      【解决方案3】:

      你不需要使用**arr,你可以使用:

      void do_something(int el, std::vector<int> *arr){
          arr->push_back(el);
      }
      

      或:

       void do_something(int el, std::vector<int> &arr){
          arr.push_back(el);
      }
      

      **arr 没有意义,但如果你坚持使用它,请这样做:

      void do_something(int el, std::vector<int> **arr){
          (*arr)->push_back(el);
      }
      

      但同样没有理由这样做......

      【讨论】:

        【解决方案4】:
        void do_something(int el, std::vector<int> **arr)
        

        应该是

        void do_something(int el, std::vector<int>& arr)
        {
            arr.push_back(el);
        }
        

        通过引用传递已被简化为在 C++ 中使用 &amp;

        【讨论】:

        • @taocp,您所说的“通过引用传递已被简化为在 C++ 中使用 &”是什么意思?
        • @gen 这是糟糕的措辞恕我直言。 C++ 真正改变的是它实际上具有传递引用根本。 C没有。它通过传递指针来实现相同的结果,并裁定更改指针取消引用的结果会在其原始位置(而不是临时副本)修改指向的值。但这不是通过引用传递。指针按值传递。
        • @taocp 任何想法,为什么接受向量数组作为参数给出错误:vector &lt;int&gt; &amp;v[100]?
        【解决方案5】:

        您可以像这样通过引用传递向量

        void do_something(int el, std::vector<int> &arr){
            arr.push_back(el);
        }
        

        但是,请注意,这个函数总是在向量的后面添加一个新元素,而您的 array 函数实际上修改了第一个元素(或初始化它的值)

        为了达到完全相同的结果,你应该这样写:

        void do_something(int el, std::vector<int> &arr){
            if (arr.size() == 0) { // can't modify value of non-existent element
                arr.push_back(el);
            } else {
                arr[0] = el;
            }
        }
        

        通过这种方式,您可以添加第一个元素(如果向量为空)或修改其值(如果第一个元素已经存在)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-31
          • 2015-04-24
          • 1970-01-01
          • 2015-12-18
          • 2013-07-07
          • 1970-01-01
          相关资源
          最近更新 更多