我是一个新手,正在做C++Primer第五版的练习,它是:
练习6.33:编写一个递归函数来打印向量的内容。
我的代码,如下所示,编译时既没有错误也没有警告。函数vector_print()
在将第一项添加到矢量中之后正常打印矢量。但在添加了第二项之后,该程序被操作系统终止。
我试着调试。在执行语句CCD_ 2时生成一个分段错误。结果是:
由于接收到来自操作系统的信号,下位机停止运行。
信号名称:sigsegov信号含义:分段故障
我读了一些关于这个错误的文章,但仍然没有得到它。有人能告诉我如何理解它并解决这个问题吗?:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
template<class T>
void vector_print(const vector<T> &_v);
int main()
{
string s;
vector<string> v;
cout<<"Please Enter:n";
while(cin>>s)
{
v.push_back(s);
cout <<"the vector is: --";
vector_print(v);
}
}
template<class T>
void vector_print(const vector<T> &_v)
{
static typename vector<T>::const_iterator it = _v.begin();
cout << *it <<" ";
++it;
if(it != _v.end())
{
vector_print(_v);
}
}
有一些问题,但主要问题是这一行:
static typename vector<T>::const_iterator it = _v.begin();
^^^^^^
由于CCD_ 3是静态,它将只初始化一次,并且对CCD_ 4的所有先前修改将在后续调用CCD_。
如果矢量从未被修改,则it
将已经位于端,因此在对vector_print
的后续调用中,此行:
cout << *it <<" ";
将取消引用结束。如果你修改了你的向量,那么调用push_back可能会使it
无效,链接的引用说:
如果新的size()大于capacity(),则所有迭代器和引用(包括过去的结束迭代器)都将无效。否则,只有过去的结束迭代器无效。
如果迭代器不是end,则不应在不首先检查的情况下递增迭代程序 这是解决问题的一种更简单的方法: 您可以从template <typename Iterator>
void printVector( Iterator first, Iterator last)
{
if( first != last )
{
std::cout << *first << " " ;
printVector( std::next( first ), last ) ;
}
}
main
调用函数,如下所示:printVector( v.begin(), v.end() ) ;
您在不首先检查迭代器是否等效于_v.end
的情况下递增迭代器。递增与end
等效的迭代器是非法的。此外,vector_print
循环不断。
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
void print_vector(vector<int>::iterator i, vector<int>::iterator j)
{
if (i != j)
{
cout << *i++ << " ";
print_vector(i, j);
}
else
{
cout << endl;
}
}
int main()
{
vector<int> v = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
print_vector(v.begin(), v.end());
return 0;
}