Как подключить свой контейнер к алгоритму max_element?
Я реализую свой контейнер. Мне нужно сделать его совместимым с алгоритмами из algorithm. Я решил начать с алгоритма max_element. Я в своем контейнере реализовал свой итератор, и передаю в max_element итератор начального элемента массива (мой контейнер реализован на динамическом массиве), а также конечный.
Но мне выдает ошибку:
Ошибка C2677 бинарный "!=": не найден глобальный оператор, принимающий тип "_FwdIt" (или приемлемое преобразование отсутствует).
Я так понимаю, что мне нужно перегрузить !=, но этот оператор у меня уже перегружен, поэтому я запутался.
Как исправить эту ошибку?
#include <iostream>
#include <algorithm>
using namespace std;
template<typename T>
class MyContainer {
public:
MyContainer(int size) {
this->size = size;
this->array = new T[this->size];
}
T& operator[](int index) {
if (index >= this->size || index < 0) {
cout << "Error, index was out of range!!!" << endl;
return this->array[0];
}
return this->array[index];
}
class Iterator;
Iterator begin() { return this->array; }
Iterator end() { return this->array + this->size; }
class Iterator
{
private:
T* cur;
public:
Iterator(T *first) : cur(first)
{}
T& operator+ (int n) { return *(cur + n); }
T& operator- (int n) { return *(cur - n); }
T& operator++ (int) { return *cur++; }
T& operator-- (int) { return *cur--; }
T& operator++ () { return *++cur; }
T& operator-- () { return *--cur; }
bool operator!= (const Iterator& it) { return cur != it.cur; }
bool operator== (const Iterator& it) { return cur == it.cur; }
T& operator* () { return *cur; }
};
~MyContainer() {
delete[] this->array;
}
private:
int size;
T* array;
};
int main() {
int size = 5;
MyContainer<int> Con(size);
for (int i = 0; i < size; i++) {
Con[i] = i * 2;
}
cout << endl << endl;
auto it1 = MyContainer<int>::Iterator(Con.begin());
auto it2 = MyContainer<int>::Iterator(Con.end());
auto result = max_element(it1, it2);
cout << *result << endl;
return 0;
}
Ответы (1 шт):
Собственно, а почему у вас инкремент/декремент возвращают T&?
Iterator& operator++ () { ++cur; return *this; }
Iterator& operator-- () { --cur; return *this; }
После чего все будет работать.