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

Что должен возвращать бинарный минус у итератора?

14.03.2021, 14:06. Показов 2015. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, пытаюсь самостоятельно реализовать шаблонный класс очередь (частный случай однонаправленного списка), и сделать к ней итератор.
Сама очередь получилась, всё работает. Итератор тоже работает как надо (в for auto всё прогоняет как следует), однако при попытке сортировки функцией sort (из algorithm) возникает ошибка: no match for 'operator-' (operand types are 'MyQueue<int>::Iterator' and 'MyQueue<int>::Iterator')

Насколько я понимаю, sort пытается использовать оператор бинарный минус для сравнения элементов (т.е. сортировки), но так как в итераторе такого оператора нет, то получается такая ошибка. Собственно вопрос в следующем - как перегрузить этот оператор для итератора? И что такой оператор должен возвращать? Новый итератор? Код прилагаю (закомментированную и НЕ рабочую попытку перегрузки бинарного минуса тоже).

Кликните здесь для просмотра всего текста
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
152
153
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
 
using namespace std;
 
template<typename T>
class MyQueue{
 
    private:
 
        // Узел очереди (состоит из значения и указателя на след. элемент очереди)
        class Node{
            public:
                T value;  // Значение узла
                Node* next = nullptr;  // Указатель на след. элемент
                Node(T value): value(value){}
        };
 
        Node* first = nullptr;  // Указатель на начало очереди
        Node* last = nullptr;  // Указатель на конец очереди
        int elems = 0; // Кол-во элементов
 
    public:
 
        // Итератор очереди
        class Iterator{
            private:
                Node* pointer;  // Указатель на узел
            
            public:
                Iterator(Node* pointer): pointer(pointer){}
 
                // Перегрузка постфиксного инкремента (с фиктивным параметром)
                void operator++(int){
                    if(this->pointer != nullptr){
                        this->pointer = this->pointer->next;
                    }
                }
 
                // Перегрузка префиксного инкремента
                void operator++(){
                    (*this)++;
                }
 
                // Перегрузка оператора разыменования
                T operator*(){
                    if(this->pointer != nullptr){
                        return this->pointer->value;
                    }else{
                        return T(0);
                    }
                }
 
                // Перегрузка оператора равенства
                bool operator==(const Iterator& b){
                    return this->pointer == b.pointer;
                }
 
                // Перегрузка оператора неравенства
                bool operator!=(const Iterator& b){
                    return this->pointer != b.pointer;
                }
 
                // Iterator& operator-(const Iterator& b){
                //     Node* res_node = new Node(this->pointer->value - b.pointer->value);
                //     return *(new Iterator(res_node));
                // }
 
                // Метод получения указателя на следующий элемент
                Node* getNext(){
                    return this->pointer->next;
                }
        };
 
        
 
        // Конструктор списка инициализации
        MyQueue(initializer_list<T> init){
            for(auto el : init)
                this->push(el);
        }
 
        // Добавление элемента в конец
        void push(T value){
 
            Node* node = new Node(value);
            
            if(this->first == nullptr){
                this->first = node;
            }
            if(this->last == nullptr){
                this->last = node;
            }else{
                this->last->next = node;
                this->last = node;
            }
 
            this->elems++;
        }
 
        // Взятие элемента из начала
        T pop(){
            
            
            if(this->first != nullptr){
 
                this->elems--;
 
                T val = this->first->value;
 
                if(this->first == this->last){
                    
                    delete this->first;
 
                    this->first = nullptr;
                    this->last = nullptr;
                }else{
 
                    Node* tmp_node = this->first->next;
 
                    delete this->first;
                    this->first = tmp_node;
                }
 
                return val;
            }else{
                return T(0);
            }
        }
 
        // Метод возврата итератора на начало
        Iterator& begin(){
            return *(new Iterator(this->first));
        }
        
        // Метод возврата итератора на конец
        Iterator& end(){
            return *(new Iterator(nullptr));
        }
 
        // Метод подсчета кол-ва элементов
        int size(){
            return this->elems;
        }
 
        // Метод проверки на пустоту
        bool empty(){
            return this->first ? false : true;
        }
 
};
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.03.2021, 14:06
Ответы с готовыми решениями:

Что должен возвращать оператор присваивания
Зачем оператору присваивания что-то возвращать? class B{ public: int a = 0; B&amp; operator=(const B&amp; obj){ ...

Что должен возвращать метод at в map?
Здравствуйте. Пишу свой аналог std::map для пары &lt;int, Класс&gt;. Реализован он как красно-черное дерево. С методом find вроде как разобрался:...

Что return должен возвращать из функции?
простите что прошу помощи но совсем не могу понять что должен return возвращять в функциях,если кто то подскажет буду очень брагодарна ...

5
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
14.03.2021, 14:48
Цитата Сообщение от klaustrofob Посмотреть сообщение
И что такой оператор должен возвращать?
вот требования для итератора sort
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
14.03.2021, 14:59
Лучший ответ Сообщение было отмечено klaustrofob как решение

Решение

этот пункт тебе по ходу нужен
Миниатюры
Что должен возвращать бинарный минус у итератора?  
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
14.03.2021, 15:40
полезная ссылка

Добавлено через 30 минут
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
14.03.2021, 16:01
klaustrofob, быстрая сортировка stl требует итераторов поддерживающих адресную арифметику.
Цитата Сообщение от klaustrofob
sort пытается использовать оператор бинарный минус для сравнения элементов (т.е. сортировки), но так как в итераторе такого оператора нет, то получается такая ошибка.
Разность пары таких итераторов возвращает количество объектов которое поместилось бы между ними. Тип такого объекта - какое-то беззнаковое целое которое абстрагируется в std::ptrdiff_t
https://en.cppreference.com/w/cpp/types/ptrdiff_t
Попробуйте в классе вашего итератора определить бинарный минус возвращающий разность указателей которые скрывают параметры.

Добавлено через 6 минут
По ссылке от _stanislav, есть код и там есть полезные штуки которые могут пригодиться также и в ranged for, например.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
15.03.2021, 12:07
Цитата Сообщение от klaustrofob Посмотреть сообщение
как перегрузить этот оператор для итератора?
В вашей реализации такой оператор будет работать очень неэффективно, т.к. по сути вынужден будет проходить по связному списку.

Цитата Сообщение от klaustrofob Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
        // Метод возврата итератора на начало
        Iterator& begin(){
            return *(new Iterator(this->first));
        }
        
        // Метод возврата итератора на конец
        Iterator& end(){
            return *(new Iterator(nullptr));
        }
Кто вас так делать научил? Этот код порождает утечку памяти.
Надо так:
C++
1
2
3
4
5
6
7
8
9
        // Метод возврата итератора на начало
        Iterator begin(){
            return Iterator(this->first);
        }
        
        // Метод возврата итератора на конец
        Iterator end(){
            return Iterator(nullptr);
        }
Цитата Сообщение от klaustrofob Посмотреть сообщение
Перегрузка постфиксного инкремента (с фиктивным параметром)
Ваша перегрузка не соответствует семантике постфиксного оператора.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.03.2021, 12:07
Помогаю со студенческими работами здесь

Подскажите, что должен возвращать функции сервиса
Доброго времени суток! Есть wsdl-описание сервиса, IHECallback.zip (Приложение 20) которое по документации федералов...

Как правильно перегрузить boundingRect ? Вообще что он должен возвращать?
Добрый день, при наследовании от QGraphicsItem надо обязательно реализовывать boundingRect, я так понял что это прямоугольник с...

Шаблон класса. Помогите описать бинарный минус
Помогите описать бинарный минус Код: #include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; template &lt;class ku&gt; ...

Difftime() должен возвращать тип double
#include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;conio.h&gt; using namespace std; int main() { time_t begin; time_t...

Ошибка: мэйн должен возвращать инт
Всем привет. Не могу понять. Говорит: мэйн должен возвращать инт. Глаз замылился.. Заранее спасибо. #include &lt;iostream&gt; ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru