通过引用传递截断的向量

时间:2015-02-23 06:46:18

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

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

以下是我正在尝试做的简化示例。我想要矢量

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;
}

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

在这一行

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

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

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

以下是两种可能的解决方案。

#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;
}

答案 1 :(得分:0)

我看到一个递归,并且example(vector<int>(ii + 1, jj));的任何调用都会创建新的向量(特别是这个vector<int>(ii + 1, jj)是在初始x的基础上创建的未命名向量),因此无法进入main您想要的代码