如何在递归函数中使用迭代器

how to use iterator in a recursive function

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

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