Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/29: Рейтинг темы: голосов - 29, средняя оценка - 4.52
4 / 1 / 0
Регистрация: 09.10.2015
Сообщений: 204
1

Реализовать итераторы begin() и end() для списка

04.10.2016, 11:19. Показов 5728. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть список. и операции для него
1)разыменование
2)инкремент (префиксный и постфиксный)
3) ==
4) !=
Для того,чтобы проверить работоспособность написанных методов ,мне нужно написать begin и end.в этом и проблема
я считаю,что нужно просто возвращать сами узлы-но компилятор ругается.
head-указатель на 1-ый узел
tail-на след за последним
Заодно посмотрите пж другие функции,мб в них ошибка
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
struct Single_node
{
    Single_node *next;
    int val;
    Single_node();
    Single_node(int);
    Single_node(int, Single_node*);
};
class Single_list
{
    Single_node *head;
    Single_node *tail;
public:
    class iterator
    {
        Single_node* node;
    public:
        int operator*()
        {
            return node->val;
        }
        Single_node operator++(int)
        {
            node = node->next;
            return *node;
        }
        Single_node operator++()
        {
            Single_node* mem = node;
            node = node->next;
            return *mem;
        }
        void operator+(int n)
        {
            for (int i = 0; i<n; i++) node = node->next;
        }
        bool operator==(Single_node* iter)
        {
            return node = iter;
        }
        bool operator!=(Single_node* iter)
        {
            return node != iter;
        }
 
    };
    iterator begin()
        {
            return iterator(head);
        }
    iterator end(){return iterator(tail);}
    Single_list();
    Single_list(int);
    ~Single_list();
    void remove_list();
    bool is_empty();
    void add_front(int);
    int size();
    int remove_front();
    bool find(int);
    int get_nth(int);
    Single_node* get_head() { return head; }
};
Single_node::Single_node() {};
 
Single_node::Single_node(int x) { val = x; }
Single_node::Single_node(int x, Single_node* t)
{
    { val = x; next = t; }
}
Single_list::Single_list()
{
    head = new Single_node();
    tail = head;
}
bool Single_list::is_empty()
{
    return head == tail;
}
Single_list::Single_list(int x)
{
    tail = new Single_node;
    head = new Single_node(x);
    head->next = tail;
}
 
Single_list::~Single_list()
{
    while (head != tail)
    {
        Single_node *temp;
        temp = head->next;
        delete head;
        head = temp;
    }
    delete head;
}
void Single_list::remove_list()
{
    Single_node* tmp = head;
    for (tmp; tmp != tail; tmp = tmp->next);
    while (head != tmp)
    {
        Single_node *temp;
        temp = head->next;
        delete head;
        head = temp;
    }
    delete head;
}
void Single_list::add_front(int x)
{
    head = new Single_node(x, head);
}
 
int Single_list::remove_front()
{
    int temp_val = head->val;
    Single_node *temp_p = head;
    head = head->next;
    delete temp_p;
    return temp_val;
}
bool Single_list::find(int we_need)
{
    Single_node *current = head;
    while (current != tail)
        if (current->val == we_need)
            return true;
        else current = current->next;
        return false;
}
 
int Single_list::get_nth(int n)
{
    Single_node *current = head;
    for (int i = 0; i<n; i++)
        current = current->next;
    return current->val;
}
int Single_list::size()
{
    Single_node *current = head;
    int sz = 0;
    while (current != tail)
    {
        current = current->next;
        sz++;
    }
    return sz;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.10.2016, 11:19
Ответы с готовыми решениями:

Итераторы begin и end
Привет всем! Возникла проблема с итераторами. Пишу класс, который содержит вектор векторов. Пишу...

Реализовать итераторы для списка
Нужно реализовать итераторы для списка вида: p++ постфиксный инкремент q-p q-это...

C++: итераторы по умолчанию, пустые итераторы, end()
Всем добра! Вопрос на тему итераторов в плюсах: 1. какие значения имеют итераторы без...

Чем отличаются итераторы ::begin и ::cbegin?
Чем отличаются итераторы ::begin и ::cbegin? Не пойму разницы, и с английским у меня не очень.

14
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
04.10.2016, 12:59 2
Kristina_S,
Посмотрите на строку 43 повнимательнее, там скрывается ошибка.
Итератор у Вас не создаётся потому, что конструктора в классе iterator подходящего нету.
Так же стоит присмотреться к строке 105, а особенно к первому блоку цикла for.

P.S. В цикле for можно оставлять пустые блоки, то есть делать даже так: for(;;)
Но осторожнее, это бесконечный цикл.
Ну это так, если Вы поэтому ошиблись с ним.
0
4 / 1 / 0
Регистрация: 09.10.2015
Сообщений: 204
04.10.2016, 15:53  [ТС] 3
1)насчет строчки 105 - этой функции здесь быть не должно) не то скопировала)
2)а по поводу конструктора-там нужен конструктор с одним аргументом? вида
C++
1
2
3
4
iterator(Single_node* tmp)
{
  node=tmp;
}
3) насчет строчки 43 пока не понимаю(
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
04.10.2016, 15:55 4
Цитата Сообщение от Kristina_S Посмотреть сообщение
3) насчет строчки 43 пока не понимаю(
Ой, это я строчки перепутал, моя вина. Я имел ввиду строку 39.

Добавлено через 15 секунд
Цитата Сообщение от Kristina_S Посмотреть сообщение
а по поводу конструктора-там нужен конструктор с одним аргументом?
Да.
0
4 / 1 / 0
Регистрация: 09.10.2015
Сообщений: 204
04.10.2016, 16:50  [ТС] 5
вы имеете ввиду что нужно определить операцию присваивания еще дополнительно? а разве поля не будут буквально сравниваться?
а конструктор верно написа?
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
04.10.2016, 17:39 6
Цитата Сообщение от Kristina_S Посмотреть сообщение
а разве поля не будут буквально сравниваться?
Что Вы имеете ввиду? Они и должны сравниваться, это же operator==, он возвращает результат сравнения двух классов между собой( в классической реализации ).
А у Вас операция присваивания, но С++ такой язык, что он позволяет такое делать. А возвращаемое значение этой функции будет зависеть от того равно ли node 0. Если не равно, то возвращается true, иначе false.
Цитата Сообщение от Kristina_S Посмотреть сообщение
а конструктор верно написа?
Вроде да.
0
4 / 1 / 0
Регистрация: 09.10.2015
Сообщений: 204
04.10.2016, 20:53  [ТС] 7
спасибо,проглядела)Только вот теперь ее вообще не видит компилятор .Выдает ошибку,мол "отсутствует != удовлет этим операндам" при написании этой конструкции.

C++
1
2
3
4
5
6
7
8
9
int main()
{
    Single_list list;
    for (int i = 0; i < 10; i++) list.add_front(i);
    for (Single_list::iterator p = list.begin(); p != list.end(); p++) cout << *p << ' ';
    cout << endl;
    return 0;
    system("pause");
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class iterator
    {
        Single_node* node;
    public:
        iterator(Single_node* tmp)
        {
            node = tmp;
        }
        int operator*()
        {
            return node->val;
        }
        Single_node operator++(int)
        {
            node = node->next;
            return *node;
        }
        Single_node operator++()
        {
            Single_node* mem = node;
            node = node->next;
            return *mem;
        }
        void operator+(int n)
        {
            for (int i = 0; i<n; i++) node = node->next;
        }
        bool operator==(Single_node* iter)
        {
            return node == iter;
        }
        bool operator!=(Single_node* iter)
        {
            return !(node == iter);
        }
    };
    iterator begin() { return iterator(head);}
    iterator end() { return iterator(tail); }
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
04.10.2016, 21:10 8
Цитата Сообщение от Kristina_S Посмотреть сообщение
"отсутствует != удовлет этим операндам" при написании этой конструкции.
Потому что у Вас в классе iterator сравниваются iterator и Single node*, а такого оператора !=, в котором сравнивались бы iterator и iterator -- нет.
Решение

Вы что, ищите лёгкого пути?

Может, всё-таки сами попробуете?

Как хотите.. Эх

C++
1
2
3
4
5
6
7
8
9
bool operator==( iterator it )
{
    return it == this->node;
}
 
bool operator!=( iterator it )
{
    return !(it == this);
}
0
4 / 1 / 0
Регистрация: 09.10.2015
Сообщений: 204
04.10.2016, 21:22  [ТС] 9
а в операторе != не нужно ли написать
C++
1
return !(it==*this)
А то если без изменений(поставил * перед this)-то ругается на то что нельзя сравнивать Single_list::iterator и Single_list::iterator*
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
04.10.2016, 21:23 10
Цитата Сообщение от Kristina_S Посмотреть сообщение
а в операторе != не нужно ли написать
Нужно, упустил этот момент.
1
4 / 1 / 0
Регистрация: 09.10.2015
Сообщений: 204
04.10.2016, 21:57  [ТС] 11
большое спасибо что помогли)

Добавлено через 25 минут
зато теперь оно ругается на то,что в конструкторе итератора происходит переполнение стека((
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
04.10.2016, 22:03 12
Kristina_S, Выложите полный код, который у Вас получился на данный момент.
1
4 / 1 / 0
Регистрация: 09.10.2015
Сообщений: 204
04.10.2016, 22:14  [ТС] 13
Сам список (без итераторов )точно полностью рабочий
.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
struct Single_node
{
    Single_node *next;
    int val;
    Single_node();
    Single_node(int);
    Single_node(int, Single_node*);
};
class Single_list
{
    Single_node *head;
    Single_node *tail;
public:
    class iterator
    {
        Single_node* node;
    public:
        iterator(Single_node* tmp)
        {
            node = tmp;
        }
        int operator*()
        { 
            return node->val;
        }
        Single_node operator++(int)
        {
            node = node->next;
            return *node;
        }
        Single_node operator++()
        {
            Single_node* mem = node;
            node = node->next;
            return *mem;
        }
        void operator+(int n)
        {
            for (int i = 0; i<n; i++) node = node->next;
        }
        bool operator==(iterator it)
        {
            return it == this->node;
        }
        bool operator!=(iterator it)
        {
            return !(it == *this);
        }
    };
    iterator begin() { return iterator(head);}
    iterator end() { return iterator(tail); }
    Single_list();
    Single_list(int);
    ~Single_list();
    void remove_list();
    bool is_empty();
    void add_front(int);
    int size();
    int remove_front();
    bool find(int);
    int get_nth(int);
    Single_node* get_head() { return head; }
};
.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <iostream>
#include "s_list.h"
using namespace std;
 
Single_node::Single_node() {};
 
Single_node::Single_node(int x) { val = x; }
Single_node::Single_node(int x, Single_node* t)
{
    { val = x; next = t; }
}
Single_list::Single_list()
{
    head = new Single_node();
    tail = head;
}
bool Single_list::is_empty()
{
    return head == tail;
}
Single_list::Single_list(int x)
{
    tail = new Single_node;
    head = new Single_node(x);
    head->next = tail;
}
 
Single_list::~Single_list()
{
    while (head != tail)
    {
        Single_node *temp;
        temp = head->next;
        delete head;
        head = temp;
    }
    delete head;
}
void Single_list::remove_list()
{
    Single_node* tmp = head;
    for (tmp; tmp != tail; tmp = tmp->next);
    while (head != tmp)
    {
        Single_node *temp;
        temp = head->next;
        delete head;
        head = temp;
    }
    delete head;
}
void Single_list::add_front(int x)
{
    head = new Single_node(x, head);
}
 
int Single_list::remove_front()
{
    int temp_val = head->val;
    Single_node *temp_p = head;
    head = head->next;
    delete temp_p;
    return temp_val;
}
bool Single_list::find(int we_need)
{
    Single_node *current = head;
    while (current != tail)
        if (current->val == we_need)
            return true;
        else current = current->next;
        return false;
}
 
int Single_list::get_nth(int n)
{
    Single_node *current = head;
    for (int i = 0; i<n; i++)
        current = current->next;
    return current->val;
}
int Single_list::size()
{
    Single_node *current = head;
    int sz = 0;
    while (current != tail)
    {
        current = current->next;
        sz++;
    }
    return sz;
}

main
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include "s_list.h"
using namespace std;
 
void print_slist(Single_list& ref)
{
    int n = ref.size();
    for (int i = 0; i <n; i++)
    {
        cout << ref.get_nth(i) << " ";
    }
    cout << endl;
}
 
 
 
 
int main()
{
    Single_list list;
    for (int i = 0; i < 10; i++) list.add_front(i);
    for (Single_list::iterator p = list.begin(); p != list.end(); p++) cout << *p << ' ';
    cout << endl;
    return 0;
    system("pause");
}
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
05.10.2016, 11:46 14
Kristina_S, Пройдитесь отладчиком в пошаговом режиме и поищите место падения метеорита программы.
0
4 / 1 / 0
Регистрация: 09.10.2015
Сообщений: 204
05.10.2016, 16:28  [ТС] 15
Я прошел -она падает на конструкторе.не могу понять что не так(((
0
05.10.2016, 16:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.10.2016, 16:28
Помогаю со студенческими работами здесь

Итераторы (пример использования итератора для шаблона, к примеру списка)
Доброго времени суток. Форумчани, приведите пожалуйста пример использования итератора для шаблона,...

Пояснить код sort(p.begin(), p.end();
встретил вот такую строку в коде sort(p.begin(), p.end()); может кто может объяснить как это...

Заменить слова “begin” и “end” на “( “ и “)” соответственно
В заданной строке содержатся слова “begin” и “end”. Заменить все эти слова на “( “ и “)” ...

Компилятор не видит реализацию методов begin() и end()
При попытке вызова основанного на диапазоне выражения for (C++) вылезает ошибка С3312 error C3312:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru