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

Incrementing iterator and passing the argument in a recursion loop

本文关键字:参数 循环 迭代器 递归      更新时间:2023-10-16

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

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

  • *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()"奇怪的循环行为"来自不同向量的迭代器的比较(因为向量每次都被复制)。

我有一个分割错误。为什么会这样?

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

return *(vec.end());

是非法的,因为vec.end()"指向"最后一个元素。它不指向最后一个元素。也许你的意思是

return vec.end()[-1];

相反?如果是,则需要在访问最后一个元素之前检查向量是否为空。

您的问题是"vec"参数是通过复制传递的,因此递归函数的每次调用都会产生一个新的向量对象,比较不同向量的迭代器是完全错误的。这就是为什么比较"po<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);
    }    
}