【问题标题】:Passing a Truncated Vector by Reference通过引用传递截断向量
【发布时间】:2015-04-24 10:47:07
【问题描述】:

我试图弄清楚是否有办法通过引用传递截断的向量,以便它仍然会更改原始向量。

这是我正在尝试做的一个简化示例。我想要矢量

x = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }

函数退出时。但是,当我的代码完成时,我得到了

{ 1, 8, 7, 6, 5, 4, 3, 2, 1, 0 }.

#include <iostream>
#include <vector>

using namespace std;

void example(vector<int> &x)
{
    vector<int>::iterator ii = x.begin();
    vector<int>::iterator jj = x.end();

    if (ii == jj) { return; }
    else { 
        *ii = 1;
        example(vector<int>(ii + 1, jj));
    }
}

int main()
{
    vector<int> x = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
    example(x);

    for (vector<int>::iterator ii = x.begin(); ii != x.end(); ii++)
        cout << *ii << " ";
    cout << endl;
}

有什么想法吗?

【问题讨论】:

  • 您可以将iterators 传递给example,这是一个可以接受的解决方案吗?
  • 在您的递归中example(vector&lt;int&gt;(ii + 1, jj)); 正在传递 temp rvalue reference,这在您的情况下意义不大,我想知道它甚至可以编译吗?

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


【解决方案1】:

在这条线上

example(vector<int>(ii + 1, jj));

您在每次调用中都创建了一个新向量,因此不会更改传入初始调用的向量。

我认为如果你想传递向量的一部分并保留原始向量,你可以传递索引或迭代器。

这里有 2 种可能的解决方案。

#include <iostream>
#include <vector>

using namespace std;

void example2(vector<int>& x, int ind = 0)
{
    if (ind < x.size()) 
    { 
        x[ind] = 1;
        example2(x, ind + 1);       
    } else 
    { 
        return;         
    }
}

void example(vector<int>::iterator start, vector<int>::iterator end)
{
    if (start == end) 
    { 
        return; 
    } else 
    { 
        *start = 1;
        example(++start, end);
    }
}

int main()
{
    vector<int> x = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
    example(x.begin(), x.end());
    //example2(x);

    for (vector<int>::iterator ii = x.begin(); ii != x.end(); ii++)
        cout << *ii << " ";
    cout << endl;
}

【讨论】:

    【解决方案2】:

    我看到了一个递归,任何对example(vector&lt;int&gt;(ii + 1, jj)); 的调用都会创建新的向量(特别是这个vector&lt;int&gt;(ii + 1, jj) 是在初始x 的基础上创建的未命名向量),所以不可能得到你想要的main用你的代码

    【讨论】:

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