通过引用传递截断的向量

问题描述:

我想知道是否有一种方法可以通过引用传递截断的向量,以便它仍然会更改原始向量。通过引用传递截断的向量

下面是我想要做的简化示例。我想在矢量

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

有什么想法?

+0

你可以将'iterators'传递给'example',这会是一个可接受的解决方案吗? – 2015-02-23 06:55:07

+0

在你的递归例子中(向量(ii + 1,jj));'是传递临时的'rvalue reference',这意味着你的情况较少,我不知道它是编译? – 2015-02-23 08:15:28

在这条线上

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

我看到一个递归和example(vector<int>(ii + 1, jj));任何呼叫创造了新的载体(尤其是这vector<int>(ii + 1, jj)是初始x基础上创建的未命名的载体),所以不可能在main得到你想要的东西与你的代码