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

Error: Выдаёт ошибку C2679 binary "[": не найден оператор, принимающий правый операнд типа "тип"

28.10.2022, 20:21. Показов 1939. Ответов 41

Студворк — интернет-сервис помощи студентам
В общем, проблемка такая. Я в программировании не особо силён. Нужно было построить класс для работы с односвязным списком. Элементы списка – целые числа. Создать список List1. Построить список List2, содержащий порядковые номера
максимальных элементов списка List1.

Проблемка в том, что мне просит компилятор перегрузить оператор индексирования [], только вот перегрузка имеется. Что делать, ума не приложу... В коде есть лишние функции, которые не используются, это норма

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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
#include <iostream>
using namespace std;
 
/* оДНОсвязный список */
 
template <typename T> /* класс должен быть шаблонным */
class List
{
    
public:
    List(); /* конструктор */
    ~List(); /* деструктор */
    
    void pop_front();       /* прототип метода. Его задача - удалить первый элемент списка */
    void push_back(T data); /* прототип метода. Push_back - добавить данные в конец списка */
    bool end()
    {
        return(head = NULL);
    }
    void clear();             /* метод просто удаляет все элементы из списка */
    T& operator[](int index); /* перегрузка оператора. В параметрах - индекс (номер элемента) */
    friend ostream& operator<< (ostream& out, const List& list);
    
    
 
    void push_front(T data);        /* метод добавляет элемент в начало списка*/
    void pop_back();                /* удаляет элемент из конца списка */
    void insert(T data, int index); /* вставляет элемент по конкретному индексу */
    
    /* value - данные, index - индекс, по которому эти данные вставлены */
    void removeAt(int index);       /* удаляет элемент из списка по указанному индексу */
 
private:
    template <typename T> /* шаблон */
    class Node              /* вложенный класс (Node - узел) */
    {
    public:                 /* здесь уже все поля можно сделать public к, т.к. сам класс private */
        Node* pNext;        /* (pNext - pointer Next) - указатель на следующий элемент */
        T data;
        
        Node (T data = T(), Node* pNext = nullptr) /* конструктор для класса "Узел". nullptr - нулевой адрес*/
        {
            this->data = data;
            this->pNext = pNext;
        }
    };
 
    int Size; /* кол-во элементов в списке */
    Node <T>* head; /* указатель, так как все элементы одн. списка выделяются в динамич. памяти */
public:
    List& operator ++ ()
    {
        head = head->pNext;
        return *this;
    }
};
 
template <typename T>
List<T>::List() /* реализация конструктора */
{
    Size = 0;
    head = nullptr; /* список пуст */
}
 
template <typename T>
List<T>::~List() /*реализация деструктора*/
{
    cout << "Вызвался деструктор" << endl;
    clear();
}
 
template<typename T>
void List<T>::pop_front()
{
    Node<T>* temp = head; /* temp - временная переменная, хранящая адрес нулевого элемента списка */
    head = head->pNext; /* в head запишем адрес следующего элемента, который идёт за head'ом */
    delete temp; /* temp указывает на те данные, которые были нашим head'ом */
    Size--; /* так как мы удалили один из элементов, число элементов надо понизить на 1 */
}
 
template<typename T>
void List<T>::push_back(T data) /* к слову, мне программа помогла реализовать этот метод*/
{
    if (head == nullptr) /* проверяем на равенство head на ноль */
    {
        head = new Node<T>(data);
    }
    else
    {
        Node<T>* current = this->head; /*current (текущий) - временный объект*/
        while (current->pNext != nullptr)
        {
            current = current->pNext;
        }
        current->pNext = new Node<T>(data);
    }
    Size++;
}
 
template<typename T>
void List<T>::clear() /* метод просто удаляет все элементы из списка */
{
    while (Size) /*Size > 0, while == TRUE, Size = 0, while == FALSE (выход из цикла, если FALSE)*/
    {
        pop_front();
    }
}
 
template<typename T>
T& List<T>::operator[](int index)
{
    int counter = 0;
    Node<T>* current = this->head; /* current отвечает за нахождение в конкретном элементе */
    while (current != nullptr)     /* цикл работает до тех пор, пока current не станет указывать на ноль */
    {                          
        if (counter == index)      /* если ноль - мы в конце списка */
        {
            return current->data;  /* у текущего элемента заберём данные из поля data */
        }
        current = current->pNext;
        counter++;
    }
}
 
 
template<typename T>
void List<T>::push_front(T data)
{
    head = new Node<T>(data, head); /* переносим "голову" в адрес другого элемента */
    Size++;
}
 
template<typename T>
void List<T>::pop_back() /* удаляем последний элемент списка */
{
    removeAt(Size - 1); /* нумерация начинается с нуля. Допустим у нас элементы с инд. 0,1,2 - всего их три */
} /* чтобы получить доступ к последнему - просто
вычитаем единицу */
 
template<typename T>
void List<T>::insert(T data, int index)
{
    if (index == 0) /* если index = 0 */
    {
        push_front(data);
    }
    else
    {
        Node<T>* previous = this->head; /* previous - временный указатель */
 
        for (int i = 0; i < index - 1; i++) /* цикл находит элемент с индексом, предшествующим (int index) */
        { /* на место которого мы хотим поместить объект */
            previous = previous->pNext; /* "-1" означает "предыдущий", как и слово previous */
        } /*в этом цикле мы просто перебираем элементы, идущие по цепочке в списке*/
 
        Node<T>* newNode = new Node<T>(data, previous->pNext); /* объект указывает на след. объект */
        previous->pNext = newNode; /*помещаем наш новый объект по указанному индексу в список */
        /* newMode переменная по факту и не нужна. Это буфер */
        Size++;
    }
 
 
}
 
template<typename T>
void List<T>::removeAt(int index) /* логика примерно такая же, как и с insert, но ориентирована на удаление */
{
    if (index == 0)
    {
        pop_front();
    }
    else
    {
        Node<T>* previous = this->head; /* задача блока кода со 159-й по 163-й строчки - найти предыдущий элемент */
        for (int i = 0; i < index - 1; i++) /* относительно того, который мы хотим удалить */
        {
            previous = previous->pNext;
        }
 
        Node<T>* toDelete = previous->pNext; /* в toDelete лежит адрес старого элемента */
        previous->pNext = toDelete->pNext; /* в тот старый адрес мы помещаем адрес элемента, который мы хотим удалить*/
        delete toDelete; /* удаляем старый адрес */
        Size--; /* уменьшаем число элементов на единицу */
    }
}
 
template<typename T>
ostream& operator<<(ostream& out, const List<T>& list)
{
    for (List<T> i = list; !i.end(); ++i)
    {
        out << list << endl;
    }
    return out;
}
 
int main()
{
    setlocale(LC_ALL, "ru");
 
    List<int> List1;
    cout << "Введите число элементов: ";
    int NumbersCount; /* переменная для числа рандомных значений*/
    cin >> NumbersCount;
 
    for (int i = 0; i < NumbersCount; i++) /* цикл для заполнения списка элементами */
    {
        cout << "Введите объект " <<i+1<<": ";
        int number;
        cin >> number;
        List1.push_back (number); /* втыкаем номер в список */
    }
    
    for (int i = 0; i != NumbersCount; i++)
    {
        cout << List1[i] <<" "; /* вывод элементов списка */
    }
    cout << endl;
    
    /* формирование второго списка */
    List<int> List2;
    int max = 0, index = 0;
 
    for (List<int> i = List1; !i.end(); ++i)
    {                       
        if (max <= List1[i]) /* если макс. элемент меньше элемента по индексу i */
        {
            List2.clear();  /* чистим наш список */
            max = List1[i]; /* мы приравниваем макс. элемент к элементу с индексом  */
            index++;
        }
        
        /* MAX ЭЛЕМЕНТ ОН ПРАВИЛЬНО ОПРЕДЕЛИЛ !!! */
        if (max >= List1[i])
        {
            List2.push_back(index); /* вставляем элемент по опред. индексу. */
        }
    }
 
    ///* если будут одинаковые элементы, он выведет не все их индексы, а только последний... */
 
    cout << endl;
    cout << "Наибольший элемент: " << max << " " << endl;
    cout << "Порядковый номер наибольшего элемента: " << index; /* index определён верно! */
    cout << endl;
 
    cout << List2 << endl;
 
    cout << endl;
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.10.2022, 20:21
Ответы с готовыми решениями:

Error C2679: бинарный "=": не найден оператор, принимающий правый операнд типа
Сразу скажу что в с++ полный ноль. Но есть потребность решить такую вот задачу: Нужно собрать систему распознавания и слежения за лицами...

Возвращение кортежа - error C2679: бинарный "=": не найден оператор, принимающий правый операнд типа
Привет есть функция, которая возвращает кортеж tuple&lt;X**, Math, int, int, std::vector&lt;std::vector&lt;int&gt;&gt;*&gt; я её...

Ошибка C2679: бинарный '=': не найден оператор, принимающий правый операнд типа 'double'
// ConsoleApplication2.cpp : Defines the entry point for the console application. // #include &quot;stdafx.h&quot; #include &quot;math.h&quot; ...

41
Заблокирован
28.10.2022, 20:29
Цитата Сообщение от Nepravilon Посмотреть сообщение
if (counter == index)      /* если ноль - мы в конце списка */
        {
            return current->data;
В других случаях нет return в перегруженном оператора = UB .
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12922 / 6789 / 1818
Регистрация: 18.10.2014
Сообщений: 17,178
28.10.2022, 20:41
Цитата Сообщение от Nepravilon Посмотреть сообщение
C++
1
2
3
4
5
6
template <typename T> /* класс должен быть шаблонным */
class List
{
  ...
  template <typename T> /* шаблон */
  class Node              /* вложенный класс (Node - узел) */
Ошибка компиляции. В С++ запрещается переиспользовать уже "занятое" имя (здесь: T) для именования параметров вложенного шаблона.

Отдельный вопрос: зачем вообще вложенный класс Node сделан самостоятельным шаблоном???

Цитата Сообщение от Nepravilon Посмотреть сообщение
C++
1
    friend ostream& operator<< (ostream& out, const List& list);
Для такого друга невозможно будет предоставить определение за пределами класса. С++ не предоставляет синтаксиса для этого. Определение должно быть приведено сразу, т.е. прямо здесь. У вас в коде его нет.

Цитата Сообщение от Nepravilon Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
template<typename T>
ostream& operator<<(ostream& out, const List<T>& list)
{
    for (List<T> i = list; !i.end(); ++i)
    {
        out << list << endl;
    }
    return out;
}
Это определение не соответствует сделанному выше friend-обьявлению. Также, out << list - это вызов этого же оператора. Бесконечная рекурсия ?

Цитата Сообщение от Nepravilon Посмотреть сообщение
просит компилятор перегрузить оператор индексирования [], только вот перегрузка имеется
Перегрузка имеется, но требует аргумента типа int. А у вас здесь

C++
1
max = List1[i];
чем является i? Как это должно работать по-вашему?

Что это вообще такое:

C++
1
    for (List<int> i = List1; !i.end(); ++i)
Что должен делать такой цикл?

Цитата Сообщение от Nepravilon Посмотреть сообщение
C++
1
2
3
4
5
    List& operator ++ ()
    {
        head = head->pNext;
        return *this;
    }
Гениально... Назовем этот design pattern "деструктивное итерирование методом утечки памяти" (ДИМУП) или вкрации "утекающий итератор".
0
Заблокирован
28.10.2022, 20:54
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
"утекающий итератор"
0
2 / 2 / 0
Регистрация: 12.06.2022
Сообщений: 175
28.10.2022, 21:05  [ТС]
что такое UB?

Добавлено через 3 минуты
Смотри, класс Node создавал не я, это код из видеоурока по односвязному списку.
Теперь, цикл по задумке должен с помощью псевдо-итератора (которого нет и быть не может по заданию) пробегать весь список пока не дойдёт до конечного элемента (метод end)
Перегрузку ++ тоже брал с форумов

Добавлено через 1 минуту
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Ошибка компиляции. В С++ запрещается переиспользовать уже "занятое" имя (здесь: T) для именования параметров вложенного шаблона.

Отдельный вопрос: зачем вообще вложенный класс Node сделан самостоятельным шаблоном???



Для такого друга невозможно будет предоставить определение за пределами класса. С++ не предоставляет синтаксиса для этого. Определение должно быть приведено сразу, т.е. прямо здесь. У вас в коде его нет.



Это определение не соответствует сделанному выше friend-обьявлению. Также, out << list - это вызов этого же оператора. Бесконечная рекурсия ?



Перегрузка имеется, но требует аргумента типа int. А у вас здесь

C++
1
max = List1[i];
чем является i? Как это должно работать по-вашему?

Что это вообще такое:

C++
1
    for (List<int> i = List1; !i.end(); ++i)
Что должен делать такой цикл?



Гениально... Назовем этот design pattern "деструктивное итерирование методом утечки памяти" (ДИМУП) или вкрации "утекающий итератор".
Короче, минимум я написал собственноручно в этом коде

Добавлено через 51 секунду
Цитата Сообщение от SmallEvil Посмотреть сообщение
В других случаях нет return в перегруженном оператора = UB .
А можете пояснить, пожалуйста, что такое UB?

Добавлено через 1 минуту
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Ошибка компиляции. В С++ запрещается переиспользовать уже "занятое" имя (здесь: T) для именования параметров вложенного шаблона.

Отдельный вопрос: зачем вообще вложенный класс Node сделан самостоятельным шаблоном???



Для такого друга невозможно будет предоставить определение за пределами класса. С++ не предоставляет синтаксиса для этого. Определение должно быть приведено сразу, т.е. прямо здесь. У вас в коде его нет.



Это определение не соответствует сделанному выше friend-обьявлению. Также, out << list - это вызов этого же оператора. Бесконечная рекурсия ?



Перегрузка имеется, но требует аргумента типа int. А у вас здесь

C++
1
max = List1[i];
чем является i? Как это должно работать по-вашему?

Что это вообще такое:

C++
1
    for (List<int> i = List1; !i.end(); ++i)
Что должен делать такой цикл?



Гениально... Назовем этот design pattern "деструктивное итерирование методом утечки памяти" (ДИМУП) или вкрации "утекающий итератор".
Итераторы нельзя использовать по заданию, нам нужно осуществить код без их помощи
0
Заблокирован
28.10.2022, 21:10
Цитата Сообщение от Nepravilon Посмотреть сообщение
А можете пояснить, пожалуйста, что такое UB?
UB - Undefined behavior (неопределенное поведение) .

Тут так много править, что мне страшновато. Опыт есть. Но сделать ошибки вероятней чем при написании кода заново.

С таким bool end(){
return (head = nullptr)
}
Далеко не уедете.
Цитата Сообщение от Nepravilon Посмотреть сообщение
Итераторы нельзя использовать по заданию, нам нужно осуществить код без их помощи
А чем указатели на узлы не годятся в качестве итератора ?
0
2 / 2 / 0
Регистрация: 12.06.2022
Сообщений: 175
28.10.2022, 21:12  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
UB - Undefined behavior (неопределенное поведение) .

Тут так много править, что мне страшновато. Опыт есть. Но сделать ошибки вероятней чем при написании кода заново.

С таким bool end(){
return (head = nullptr)
}
Далеко не уедете.

А чем указатели на узлы не годятся в качестве итератора ?
Могут годиться))
Я имел ввиду конкретно реализацию самого итератора. Так-то я бы реализовал (кое-как), но по тексту задания нельзя юзать.

Насчёт метода end - я его тоже скоммуниздил ахах, ничего святого :*D
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12922 / 6789 / 1818
Регистрация: 18.10.2014
Сообщений: 17,178
28.10.2022, 21:15
Цитата Сообщение от Nepravilon Посмотреть сообщение
Смотри, класс Node создавал не я, это код из видеоурока по односвязному списку.
Ну так не надо смотреть подобный трэшак. Где вы нашли такие "видеоуроки"?
0
2 / 2 / 0
Регистрация: 12.06.2022
Сообщений: 175
28.10.2022, 21:17  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Ну так не надо смотреть подобный трэшак. Где вы нашли такие "видеоуроки"?
Разве это трешак? Это единственный адекватный урок по односвязным спискам - от SimpleCode.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12922 / 6789 / 1818
Регистрация: 18.10.2014
Сообщений: 17,178
28.10.2022, 21:20
Цитата Сообщение от Nepravilon Посмотреть сообщение
Это единственный адекватный урок по односвязным спискам - от SimpleCode.
Сорри, но если "адекватные" уроки содержит такие грубые и элементарные ошибки и странности, как перечисленные мною выше, то я боюсь даже предположить, как будут выглядеть "неадекватные" уроки.

Мы не в первый раз видим здесь эту реализацию списка вот с этим загадочным, необъяснимым и совершенно не нужным явлением: шаблон узла внутри шаблона списка. Вот, значит, где у этого явления гнездо...
0
Заблокирован
28.10.2022, 21:35
С проходом по списку начинаю понимать.
Но шаг влево шаг вправо, расстрел на месте.
Это только пример!!!
Нет деструктора и прочего бобра.
Не забывайте про Правило Трех.
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
#include <iostream>
 
using namespace std;
template <class T>
class List{
    struct Node{
    
        T data;
        Node* next;
        Node(const T& data, Node* next = nullptr):data{data}, next{next}{}
    };
    Node* it=nullptr; // наш итератор
    Node* head=nullptr;
public:
    bool begin(){
       return (it = head);
    }
    T& get(){
       return it->data;
    }
    void next(){
       it = it->next;
    }
    bool end(){
       return it==nullptr;
    }
    void push_front(const T& data){
        head = new Node(data, head);
    }
};
 
int main()
{
    List<int> l;
    for(int i=10; i>0; --i)
       l.push_front(i);
    for(l.begin(); !l.end(); l.next())
        cout << l.get() << endl;
    for(l.begin(); !l.end(); l.next())
        cout << l.get() << endl;
}
0
2 / 2 / 0
Регистрация: 12.06.2022
Сообщений: 175
28.10.2022, 21:44  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
С проходом по списку начинаю понимать.
Но шаг влево шаг вправо, расстрел на месте.
Это только пример!!!
Нет деструктора и прочего бобра.
Не забывайте про Правило Трех.
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
#include <iostream>
 
using namespace std;
template <class T>
class List{
    struct Node{
    
        T data;
        Node* next;
        Node(const T& data, Node* next = nullptr):data{data}, next{next}{}
    };
    Node* it=nullptr; // наш итератор
    Node* head=nullptr;
public:
    bool begin(){
       return (it = head);
    }
    T& get(){
       return it->data;
    }
    void next(){
       it = it->next;
    }
    bool end(){
       return it==nullptr;
    }
    void push_front(const T& data){
        head = new Node(data, head);
    }
};
 
int main()
{
    List<int> l;
    for(int i=10; i>0; --i)
       l.push_front(i);
    for(l.begin(); !l.end(); l.next())
        cout << l.get() << endl;
    for(l.begin(); !l.end(); l.next())
        cout << l.get() << endl;
}
Да, понял, что пример))
Потому что реализацию, во-первых, нужно с клавиатуры приводить

Добавлено через 1 минуту
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Сорри, но если "адекватные" уроки содержит такие грубые и элементарные ошибки и странности, как перечисленные мною выше, то я боюсь даже предположить, как будут выглядеть "неадекватные" уроки.

Мы не в первый раз видим здесь эту реализацию списка вот с этим загадочным, необъяснимым и совершенно не нужным явлением: шаблон узла внутри шаблона списка. Вот, значит, где у этого явления гнездо...
Хах, и что же вы теперь будете с этим "гнездом" делать?))
0
Заблокирован
28.10.2022, 21:47
Цитата Сообщение от Nepravilon Посмотреть сообщение
нужно с клавиатуры приводить
Это никак не влияет на законченность кода и его готовность к сдаче.
0
2 / 2 / 0
Регистрация: 12.06.2022
Сообщений: 175
28.10.2022, 21:53  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Это никак не влияет на законченность кода и его готовность к сдаче.
Хм, я в принципе приводил в своём коде уже эту реализацию (выше)

Добавлено через 4 минуты
Цитата Сообщение от SmallEvil Посмотреть сообщение
Это никак не влияет на законченность кода и его готовность к сдаче.
Кстати, а что если использовать #include <list>?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12922 / 6789 / 1818
Регистрация: 18.10.2014
Сообщений: 17,178
28.10.2022, 21:55
Цитата Сообщение от Nepravilon Посмотреть сообщение
Хах, и что же вы теперь будете с этим "гнездом" делать?))
Зависит от настроения...
Миниатюры
Error: Выдаёт ошибку C2679 binary "[": не найден оператор, принимающий правый операнд типа "тип"  
0
Заблокирован
28.10.2022, 21:58
Цитата Сообщение от Nepravilon Посмотреть сообщение
Кстати, а что если использовать #include <list>?
А что если вообще компьютер не использовать ?
0
2 / 2 / 0
Регистрация: 12.06.2022
Сообщений: 175
28.10.2022, 22:03  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
А что если вообще компьютер не использовать ?
Понял вас )
Просто подумал, что это может быть как возможный вариант развития программки
0
Заблокирован
28.10.2022, 22:16
Цитата Сообщение от Nepravilon Посмотреть сообщение
Просто подумал, что это может быть как возможный вариант развития программки
Что именно использовать, определяется по поставленной задачи.
Какое у вас задание, нам неведомо.
0
2 / 2 / 0
Регистрация: 12.06.2022
Сообщений: 175
28.10.2022, 22:21  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Что именно использовать, определяется по поставленной задачи.
Какое у вас задание, нам неведомо.
Так я же сказал про задание, у нас есть два списка. В одном числа, в другом - порядковые номера наибольших чисел первого списка.
Я реализовал снова заполнение первого списка целыми числами на основе вашего кода, и чуть-чуть отсебятины

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
#include <iostream>
#include <list>
#include <vector>
 
using namespace std;
 
template <class T>
class List 
{
    struct Node 
    {
        T data;
        Node* next;
        Node(const T& data, Node* next = nullptr) : data { data }, next { next } {}
    };
 
    Node* it = nullptr; /* наш итератор */ 
    Node* head = nullptr;
 
public:
    bool begin() 
    {
        return (it = head);
    }
    T& get() 
    {
        return it->data;
    }
    void next() 
    {
        it = it->next;
    }
    bool end() 
    {
        return it == nullptr;
    }
    void push_front(const T& data) 
    {
        head = new Node(data, head);
    }
    void push_back(const T& data)
    {
        if (head == nullptr)
        {
            head = new Node(data);
        }
        else
        {
            Node* current = this->head; /* current - временный */
            while (current->next != nullptr)
            {
                current = current->next;
            }
            current->next = new Node(data);
        }
    }
};
 
int main()
{
    setlocale(LC_ALL, "ru");
 
    List<int> List1;
    cout << "Введите число элементов: ";
    int NumbersCount; /* переменная для числа рандомных значений*/
    cin >> NumbersCount;
 
    for (int i = 0; i < NumbersCount; i++) /* цикл для заполнения списка элементами */
    {
        cout << "Введите объект " << i + 1 << ": ";
        int number;
        cin >> number;
        List1.push_back(number); /* втыкаем номер в список */
    }
 
    for (List1.begin(); !List1.end(); List1.next())
        cout << List1.get() <<" "; /* вывод элементов списка */
    cout << endl;
    
    /* ФОРМИРОВАНИЕ ВТОРОГО СПИСКА */
    List<int> List2;
 
 
    cout << endl;
    return 0;
}
0
Заблокирован
28.10.2022, 23:37
Цитата Сообщение от SmallEvil Посмотреть сообщение
С проходом по списку начинаю понимать.
Но шаг влево шаг вправо, расстрел на месте.
Если перед каждым использовании List::get() проверять на List::end(), то все будет Ок.

Цитата Сообщение от Nepravilon Посмотреть сообщение
/* ФОРМИРОВАНИЕ ВТОРОГО СПИСКА */
    List<int> List2;
Формирование второго списка невозможно без полного анализа первого.
Все промежуточные списки будут временными, пока не завершится анализ.

Например :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
List<int> List2;
List1.begin();
if (!List1.end()){
   int max = List1.get() , i=1;
   List2.push_front(i);
   ++i;
   for (/*продолжаем*/ List1.next(); !List1.end(); List1.next()){
      if (List1.get() == max)
          List2.push_front(i);
      else if (List1.get() > max){
          List2.clear();
          max = List1.get();
          List2.push_front(i);
      }
      ++i;
   }
}
Добавлено через 6 минут
Цитата Сообщение от Nepravilon Посмотреть сообщение
Так я же сказал про задание
Если явно не указанно создать самому класс Односвязный Список, тогда зачем вы его велосипедите.
И что значит : нельзя использовать итераторы тогда. Этого в задании нету , но вы это пишите как часть условия.
То есть, задание либо не полное, либо вы выдумываете.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.10.2022, 23:37
Помогаю со студенческими работами здесь

Error C2679: бинарный "<<": не найден оператор, принимающий правый операнд типа "std::string" (или приемлемое
эмулятор работы банкомата Например #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;time.h&gt; ...

binary "оператор": не найден оператор, принимающий правый операнд типа "тип" (или приемлемое преобразование отсутствует)
Выдаёт ошибку С2679: бинарный &quot;-&quot; не найден оператор, принимающий правый операнд типа &quot;std::chrono::steady_clock::time_point&quot;(или...

Error C2679: бинарный ">>": не найден оператор, принимающий правый операнд
перелопатил кучу форумов, кругом одно и то же - якобы вставь библиотеку и будет счастье. раньше работало нормально. могут ли сторонние...

Error C2679: бинарный "=": не найден оператор, принимающий правый операнд
Ошибка 1 error C2679: бинарный &quot;=&quot;: не найден оператор, принимающий правый операнд типа...

Ошибка C2679 бинарный "<<": не найден оператор, принимающий правый операнд типа
void SerializeInstitute(ofstream&amp; fileStream, Institute imi) { fileStream &lt;&lt; &quot;Course{\n&quot; &lt;&lt; endl &lt;&lt; &quot;Students: &quot; &lt;&lt;...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru