2015-11-03 3 views
1

Я изучаю 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***) 

я чувствую, как его посредственное Каус решения я не могу найти другой способ.

спасибо !!

+0

vector <> :: итератор - это итератор с произвольным доступом, поэтому другой способ написать 'if (it1! = It2-1)' is 'if (it1 JackyZhu

ответ

4

Ваша функция не принимает пустой диапазон, который он должен, и это хорошая идея поставить условие выхода в начало рекурсивной функции:

void printVector(vector<int>::iterator it1, vector<int>::iterator it2) 
{ 
    if(it1 == it2) return; 
    cout << *it1++ << " "; 
    printVector(it1, it2); 
} 
+0

Ninja'd. Используя илитераторы или индексы или какой-либо другой метод, вы должны каким-то образом последовательно выбирать элементы в векторе. –

+0

сначала я сделал (it1! = It2), но потом программа выйдет из строя ... Я представляю, что это couse it1 сначала выходит из диапазона, и программа распознает его перед оценкой «если» правильно? Проблема заключается в том, что я не могу добавить сначала в итератор, а затем оценить: O –

+0

@GaryAndresGutierrezFajardo проблема - это итератор разыменования, прежде чем вы проверяете, действительно ли это. – Slava

2

Да.

void printVector(vector<int>::iterator begin, vector<int>::iterator end) 
{ 
    if (begin != end) { 
     cout << *begin << " "; 
     printVector(++begin, end)(; 
    } 
} 
1

Да, вы, вероятно, захотите пойти по нему по-другому. Это довольно глупо делать рекурсию, когда будет выполняться простой цикл. Вместо этого рекурсия - это инструмент для использования в более разном стиле покорения. То есть разделите на две части, затем примените ту же функцию к первой части, а затем ко второй части.

Обычно у вас есть какая-то точка отсечения относительно того, когда вы действительно можете делать то, что вы хотите сделать, скажем, например, что у вас меньше 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.