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

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

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

Студворк — интернет-сервис помощи студентам
Есть список. и операции для него
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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.10.2016, 11:19
Ответы с готовыми решениями:

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

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

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

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

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

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

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
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
04.10.2016, 21:10
Цитата Сообщение от 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  [ТС]
а в операторе != не нужно ли написать
C++
1
return !(it==*this)
А то если без изменений(поставил * перед this)-то ругается на то что нельзя сравнивать Single_list::iterator и Single_list::iterator*
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
04.10.2016, 21:23
Цитата Сообщение от Kristina_S Посмотреть сообщение
а в операторе != не нужно ли написать
Нужно, упустил этот момент.
1
4 / 1 / 0
Регистрация: 09.10.2015
Сообщений: 204
04.10.2016, 21:57  [ТС]
большое спасибо что помогли)

Добавлено через 25 минут
зато теперь оно ругается на то,что в конструкторе итератора происходит переполнение стека((
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
04.10.2016, 22:03
Kristina_S, Выложите полный код, который у Вас получился на данный момент.
1
4 / 1 / 0
Регистрация: 09.10.2015
Сообщений: 204
04.10.2016, 22:14  [ТС]
Сам список (без итераторов )точно полностью рабочий
.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
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
05.10.2016, 11:46
Kristina_S, Пройдитесь отладчиком в пошаговом режиме и поищите место падения метеорита программы.
0
4 / 1 / 0
Регистрация: 09.10.2015
Сообщений: 204
05.10.2016, 16:28  [ТС]
Я прошел -она падает на конструкторе.не могу понять что не так(((
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.10.2016, 16:28
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru