题目描述:编写一个递归函数,输出Vector对象的内容。
思路: 形参为两个迭代器可以解这个题,递归条件:v_begin!=v_end;每调用一次就将v_begin后移一位。
代码:
#include<iostream>
using namespace std;
#include<vector>
void PrintVector(vector<int>::iterator v_begin, vector<int>::iterator v_end)
{
if (v_begin!=v_end)
{
cout << *v_begin << endl;
PrintVector(++v_begin,v_end);
}
}
void test02()
{
vector<int> v = { 1,2,3,4,6,8,10 };
PrintVector(v.begin(), v.end());
}
int main()
{
test02();
system("pause");
return 0;
}
运行效果:
但是不是以上形参格式的话有可能报错:
报错时,代码如下:
#include<iostream>
using namespace std;
#include<vector>
void PrintVector(vector<int> v,vector<int>::iterator vbegin)
{
if (vbegin!=v.end())
{
cout << *vbegin << endl;
++vbegin;
return PrintVector(v,vbegin );
}
else
{
return;
}
}
void test02()
{
vector<int> v = { 1,2,3,4,6,8,10 };
PrintVector(v, v.begin());
}
int main()
{
test02();
system("pause");
return 0;
}
报错:提示向量与迭代器不兼容,
原因:PrintVector传入的是普通形参,运行时, 先将实参v拷贝一份,拷贝之后的v.end()就不是传入的那个v的迭代器了,自然就不能与传入的vbegin进行比较。
解决方案:将第一个形参改为引用即可,这样vbegin与v.end()就是同一个v下的迭代器了,就不会不兼容了。
改进后:
//在这里改为传入v的引用
void PrintVector(vector<int> &v,vector<int>::iterator vbegin)
{
if (vbegin!=v.end())
{
cout << *vbegin << endl;
PrintVector(v, ++vbegin);
}
}
void test02()
{
vector<int> v = { 1,2,3,4,6,8,10 };
PrintVector(v, v.begin());
}
int main()
{
test02();
system("pause");
return 0;
}
运行效果同上。
问题解决!其实这个习惯不好,要么都传迭代器,要么只传vector,不要混着传。
以上是对习题6.33的一些总结,供大家查阅参考。