2

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

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

4

3 回答 3

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

于 2013-08-29T16:51:09.507 回答
3

我得到一个分段错误。为什么是这样?

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

return *(vec.end());

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

return vec.end()[-1];

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

于 2013-08-29T16:44:40.687 回答
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);
    }    
} 
于 2013-08-29T16:54:35.440 回答