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

C++ 递增迭代器并在递归循环中传递参数,c++,recursion,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(int-cnt,std::vector-vec){ 如果(cnt

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

void pvec(int cnt, std::vector<int> vec) {
    if(cnt < vec.size()) {
        std::cout << vec[cnt++] << std::endl;
        return pvec(cnt,vec);
    }
}
void pvec(int-cnt,std::vector-vec){
如果(cnt
void pvec(std::vector<int>::iterator po, std::vector<int> vec)
{
    if(po < vec.end()) {
        std::cout << *po++ << std::endl;
        return pvec(po,vec);
    }
}
因为您的代码调用了未定义的行为

return *(vec.end());
是非法的,因为
vec.end()

return vec.end()[-1];
相反?如果是,在访问最后一个元素之前,需要检查向量是否为空。

  • *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);
    }
}
void pvec(std::vector::const_迭代器po,const std::vector&vec)
{
如果(po!=vec.end()){
std::cout您的问题是“vec”参数是通过copy传递的,因此递归函数的每次调用都会产生一个新的向量对象,比较不同向量的迭代器是完全错误的。这就是为什么比较“po
另外,我不理解返回值的目的。您应该修复第二个参数,使其通过常量引用传递,并且不返回任何内容:

void pvec(std::vector<int>::iterator po, const std::vector<int>& vec)
{
    if(po < vec.end()) {
        std::cout << *po++ << std::endl;
        pvec(po,vec);
    }    
} 
void pvec(std::vector::iterator po,const std::vector&vec)
{
如果(采购订单std::无论我返回*(vec.end())、*(vec.end()-1)还是任何其他整数,我似乎都会出现分段错误。我实际上并没有在输出中使用这个整数。我只是把它留在了,因为它似乎对上面的程序有效。@同志,那么你需要彻底地重新设计和重新思考你的代码。“我只是把东西放在里面,因为它在其他地方起作用”就像说“我会在俄罗斯喊‘我讨厌共产党!’,因为它在德国起作用”……向量是在堆栈上创建的(因为是通过副本传递的),所以我不认为segfult是因为访问*vec.end()。可能是由于对递归函数的无限次调用的堆栈溢出造成的。@LarryPel函数中有一个终止条件。这几乎不会导致无限次递归。无论如何,对程序的行为进行推理是完全没有意义的,因为它是未定义的。返回*vec.end()只返回向量后面的任何内容。是的,对不起。起初我在考虑另一种方法,并从int函数开始。但你是对的,返回没有任何意义。不过,这并不能回答问题。@H2CO3:answer编辑以解释崩溃和“奇怪的循环行为”"。确实如此。@LarryPel在下面提供了一个更彻底的解释,但基本上迭代器po只是在第一个副本中不断迭代,但与后续副本进行比较。两者之间没有关系,因此它会永远循环。如果需要引用向量以指向原始对象,为什么我们可以忽略引用原始迭代器?为什么迭代器不以相同的方式每次复制?根据解释,似乎迭代器迭代器连续地通过第一个副本。并且不返回..任何东西,可能?或者返回void