递增迭代器并在递归循环中传递参数
Incrementing iterator and passing the argument in a recursion loop
我想使用递归函数打印出向量的值。
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);
}
}
相关文章:
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 带有多个独立参数的C++For循环
- 如何在不知道C++中有多少可选参数的情况下在循环中使用va_arg?
- 如何在没有可变参数函数的情况下循环函数的参数
- C++是否在 for 循环之前获取参数
- 循环访问多个模板参数的递归模板函数
- need else 参数只出现一次,无论在循环中输入多少字符串
- 为什么基于循环范围不直接在C 中使用参数阵列
- 使用 std::vector<Particle> 粒子;函数 .at() 不能与迭代器一起使用,它作为 for 循环中的参数
- 如何循环访问在 cmd 中获取参数的 exe 文件
- C++参数类型以接受适用于基于范围的 for 循环的所有序列
- 如何使用 int 参数循环访问模板函数
- 像在 Python 中一样C++循环中的参数解析。为什么不起作用?
- 为什么当数组作为调用方函数中的参数传递时,不能在被调用函数中使用 foreach 循环打印数组的值
- 参数在循环后丢失值
- 我的功能跳过C 中的循环参数
- 无法推断模板参数"循环类型"
- 模板参数中的循环依赖关系
- 在C++标准中,当我同时使用 list.begin() 作为 list.splice() 的第一个和第三个参数时,为什么会发生无限循环
- 如何将参数循环到具有相同名称的多个结构