通过引用传递截断的向量
Passing a Truncated Vector 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;
}
有什么想法吗?
我看到一个递归,任何对 example(vector<int>(ii + 1, jj));
的调用都会创建新的向量(特别是这个 vector<int>(ii + 1, jj)
是在初始 x
的基础上创建的未命名向量),所以不可能使用您的代码main
获取您想要的内容
这条线
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;
}
我想知道是否有办法通过引用传递截断的向量,以便它仍然更改原始向量。
这是我正在尝试做的一个简化示例。我想要矢量
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;
}
有什么想法吗?
我看到一个递归,任何对 example(vector<int>(ii + 1, jj));
的调用都会创建新的向量(特别是这个 vector<int>(ii + 1, jj)
是在初始 x
的基础上创建的未命名向量),所以不可能使用您的代码main
获取您想要的内容
这条线
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;
}