如何在递归函数中使用迭代器
how to use iterator in a recursive function
im正在研究c++引物,在一个练习中,我必须执行一个递归函数,将元素打印到向量上。
我做到了:
void printVector(vector<int>::iterator it1, vector<int>::iterator it2) {
cout << *it1 << " ";
if (it1 != it2-1)
printVector((it1 + 1), it2);
}
有没有其他没有的表格可以申报
if(it1!= ***IT2-1***)
我觉得这是一个平庸的解决方案,因为我找不到其他方法。
谢谢!!
您的函数不接受空范围,这是它应该接受的,并且最好将退出条件放入递归函数的开头:
void printVector(vector<int>::iterator it1, vector<int>::iterator it2)
{
if( it1 == it2 ) return;
cout << *it1++ << " ";
printVector(it1, it2);
}
是。
void printVector(vector<int>::iterator begin, vector<int>::iterator end)
{
if (begin != end) {
cout << *begin << " ";
printVector(++begin, end)(;
}
}
是的,您可能想用另一种方式。当一个简单的循环就可以进行递归时,进行递归是非常愚蠢的。相反,递归是一种用于更具分治风格的工具。即分成两部分,然后将相同的函数应用于第一部分,然后应用于第二部分。
通常情况下,你会有一个截止点,什么时候你可以真正做你想做的任何事情,比如说你有少于N个元素可以使用或类似。这个例子非常做作,因为它只会带来递归操作的开销。
template<class Iter>
void printVector(Iter begin, Iter end)
{
const auto dist = std::distance(begin, end);
if (0 == dist) {
return;
} else if (1 == dist) {
std::cout << *begin;
} else {
// Find the middle
auto pivot = begin + dist/2;
// Apply to first part
printVector(begin, pivot);
// Print separator
std::cout << " ";
// Apply to second part
printVector(pivot, end);
}
}
请原谅任何拼写错误和其他问题。哦,我也把它做成了一个模板,这样它就可以接受任何随机访问迭代器。这主要是因为两次键入vector<int>::iterator
感觉很烦人。顺便说一下,这可能是vector<int>::const_iterator
。
相关文章:
- 为什么在指向对象的迭代器上调用函数不允许我更改对象本身?
- C++:复制迭代器的构造函数
- 专门C++使用指针值类型的通用迭代器的模板函数?
- 从 std::vector 迭代器中执行函数指针
- 如何确定迭代器在 c++ 模板函数中指向的对象的类型?
- 如何使用提升范围将自定义迭代器封装在函数中
- 调用模板函数的问题"No matching function for call"参数:迭代器、对象函数
- 迭代器end()函数与指针算术无法使用
- Union-Find方法性能,迭代与递归
- C++迭代器作为 lambda 函数中的参数,断言失败:"vector iterators incompatible"
- 为 map<T1、T2> 迭代器创建模板函数
- 将迭代器传递到函数中
- 如何使用 2 个迭代器进行求和函数计算映射<字符串、双精度>
- 段错误:使用迭代器的插入函数
- C++带有迭代器的模板函数
- 在C++中为迭代器编写运算符==函数
- 字符串迭代器和理解函数
- 类成员容器迭代器在成员函数std::find中不兼容,但为什么不兼容呢
- 从迭代器对创建函数参数包
- 如何将模板类的容器的迭代器传递给函数