итератор не может остановиться в конце (c ++)

То, что я хочу сделать, это найти kth до последнего элемента одного связанного списка. У меня есть рекурсивное решение ниже:
В функции main () я создаю список с номерами от 10 до 1

int main()
{
int i;
forward_list<int> flist;
for (i = 1; i <= 10; i ++)
flist.push_front(i);

forward_list<int>::iterator iter;
cout << "Original Sequence:" << endl;
for (iter = flist.begin(); iter != flist.end(); iter ++)
cout << *iter << " ";
cout << endl;

forward_list<int>::iterator end = flist.end();
forward_list<int>::iterator begin = flist.begin();
forward_list<int>::iterator ret;

ret = test_func(begin, end);
cout << "The " << TARGET << "th(st,nd,rd) to last element is " << *ret << endl;
return 0;
}

После того, как я создал список, я вызываю test_func. Возвращаемое значение должно быть итератором элемента, который я хочу.

#define TARGET 3
static int counttt = 0;

forward_list<int>::iterator test_func(forward_list<int>::iterator iter, forward_list<int>::iterator end)
{

cout << "test..." << endl;

forward_list<int>::iterator temp;
if ((iter ++) != end)
temp = test_func(iter, end);
counttt ++;
if (counttt < TARGET)
return end;
else if (counttt == TARGET)
return iter;
else
return temp;
}

«Тест …» предназначен для отладки, которая говорит мне, сколько раз вызывался метод test_func (). Здесь, на мой взгляд, test_func () нужно вызывать 10 раз. Тем не менее, он будет вызываться 11 раз, и последний раз вызовет ошибку сегментации. Я чувствую, что ((iter ++)! = End) не происходит в нужное время.

Все коды указаны ниже:

#include <forward_list>
#include <iostream>
#include <algorithm>
#include <stdlib.h>

using namespace std;

#define TARGET 3
static int counttt = 0;

forward_list<int>::iterator test_func(forward_list<int>::iterator iter, forward_list<int>::iterator end)
{

cout << "test..." << endl;

forward_list<int>::iterator temp;
if ((iter ++) != end)
temp = test_func(iter, end);
counttt ++;
if (counttt < TARGET)
return end;
else if (counttt == TARGET)
return iter;
else
return temp;
}

int main()
{
int i;
forward_list<int> flist;
for (i = 1; i <= 10; i ++)
flist.push_front(i);

forward_list<int>::iterator iter;
cout << "Original Sequence:" << endl;
for (iter = flist.begin(); iter != flist.end(); iter ++)
cout << *iter << " ";
cout << endl;

forward_list<int>::iterator end = flist.end();
forward_list<int>::iterator begin = flist.begin();
forward_list<int>::iterator ret;

ret = test_func(begin, end);
cout << "The " << TARGET << "th(st,nd,rd) to last element is " << *ret << endl;
return 0;
}

Спасибо,

Кевин Чжоу

0

Решение

То, что у вас есть, это пост увеличение: iter++, Это означает: увеличить его на единицу и вернуть старый значение.

Что вам нужно, это предварительное увеличение: ++iter, Это означает: Инерционируйте его по одному и возвращайте новый значение.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]