递增迭代器并在递归循环中传递参数

时间:2013-08-29 16:36:55

标签: c++ recursion

我想使用递归函数打印出矢量的值。

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作为参考,但这也不起作用。

3 个答案:

答案 0 :(得分:3)

  

我遇到了分段错误。这是为什么?

因为您的代码调用了未定义的行为。

return *(vec.end());

是非法的,因为vec.end()“指向”过去最后一个元素。 指向最后一个元素。也许你的意思是

return vec.end()[-1];

代替?如果是这样,您需要在访问最后一个元素之前检查向量是否为空。

答案 1 :(得分:3)

  • * vec.end()不正确。
  • 返回值的目的是什么?
  • 您应该使用引用来避免每次都复制矢量。
  • 添加一些常量。

修正版:

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