我想使用递归函数打印出矢量的值。
void pvec(int cnt, std::vector<int> vec) {
if(cnt < vec.size()) {
std::cout << vec[cnt++] << std::endl;
return pvec(cnt,vec);
}
}
我没有使用向量下标,而是想使用迭代器。但是,当我编写一个类似的函数,我传递第一个参数的迭代器并尝试使用递增的迭代器返回函数时,循环不会停止并且我得到分段错误。这是为什么?
void pvec(std::vector<int>::iterator po, std::vector<int> vec)
{
if(po < vec.end()) {
std::cout << *po++ << std::endl;
return pvec(po,vec);
}
}
我确实尝试过po作为参考,但这也不起作用。
答案 0 :(得分:3)
我遇到了分段错误。这是为什么?
因为您的代码调用了未定义的行为。
return *(vec.end());
是非法的,因为vec.end()
“指向”过去最后一个元素。 不指向最后一个元素。也许你的意思是
return vec.end()[-1];
代替?如果是这样,您需要在访问最后一个元素之前检查向量是否为空。
答案 1 :(得分:3)
修正版:
void pvec(std::vector<int>::const_iterator po, const std::vector<int>& vec)
{
if(po != vec.end()) {
std::cout << *po++ << std::endl;
pvec(po, vec);
}
}
崩溃来自* vec.end() “奇怪的循环行为”来自不同向量的迭代器的比较(每次复制向量)。
答案 2 :(得分:1)
你的问题是“vec”参数是通过副本传递的,所以每次调用递归函数都会产生一个新的矢量对象,并且比较不同向量的迭代器是完全错误的。这就是为什么你的比较“po&lt; vec.end()”和递归永远不会结束。
另外,我不明白返回值的目的。您应该修复第二个参数以通过常量引用传递并且不返回任何内容:
void pvec(std::vector<int>::iterator po, const std::vector<int>& vec)
{
if(po < vec.end()) {
std::cout << *po++ << std::endl;
pvec(po,vec);
}
}