Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Подскажите, пожалуйста, как работает итератор? Есть класс вектор и для него хочу реализовать итератор, но не работает?

Евгения Ученик (103), на голосовании 5 лет назад
#include
#include
using namespace std;
class Iterator;
class Vector
{
int *arr;
int size;
public:
friend Iterator;
Iterator begin();
Iterator end();
Vector(){ arr = NULL; size = 0; }
Vector(int s = 0)
{
if (s > 0)
{
size = s;
arr = new int[s];
for (int i = 0; i < s; i++)
arr[i] = 0;
}
}
~Vector()
{
if (arr)
delete[]arr;
}
Vector(const Vector & B)
{
if (B.size > 0)
{
size = B.size;
arr = new int[size];
for (int i = 0; i < size; i++)
arr[i] = B.arr[i];
}
else
{
size = 0;
arr = 0;
}
}
void PrintV(){ for (int i = 0; i < size; i++)printf_s("%d ", arr[i]); printf_s("\n"); }
void ScanV()
{
for (int i = 0; i < size; i++)
scanf_s("%d ", &arr[i]);
}
int Get_size()
{
return size;
}
int Get_el(int i)
{
return arr[i];
}
Vector operator *(const Vector &B)
{
Vector C(size);
if (size == B.size)
{
for (int i = 0; i < size; i++)
C.arr[i] = arr[i] * B.arr[i];
return C;
}
else
printf_s("\nРазмерности векторов не совпадают\n");
return *this;

}
Vector operator *(int d)
{
for (int i = 0; i < size; i++)
arr[i] = arr[i] * d;
return *this;
}
Vector operator +(const Vector&B)
{
Vector C(size);
if (size == B.size)
{
for (int i = 0; i < size; i++)
C.arr[i] = arr[i] + B.arr[i];
return C;
}
else
printf_s("\nРазмерности векторов не совпадают\n");
return *this;
}
Vector operator +(int d)
{
for (int i = 0; i < size; i++)
arr[i] = arr[i] + d;
return *this;
}
Vector operator -(const Vector&B)
{
Vector C(size);
if (size == B.size)
{
for (int i = 0; i < size; i++)
C.arr[i] = arr[i] - B.arr[i];
return C;
}
else
printf_s("\nРазмерности векторов не совпадают\n");
return *this;
}
Vector operator -(int d)
{
for (int i = 0; i < size; i++)
arr[i] = arr[i] - d;
return *this;
}
bool operator >(const Vector &B)
{
int s1 = 0, s2 = 0;
for (int i = 0; i < size; i++)
{
s1 = s1 + arr[i] * arr[i];
s2 = s2 + B.arr[i] * B.arr[i];
}
if (s1 > s2)
return true;
return false;

}
bool operator <(const Vector &B)
{
int s1 = 0, s2 = 0;
for (int i = 0; i < size; i++)
{
s1 = s1 + arr[i] * arr[i];
s2 = s2 + B.arr[i] * B.arr[i];
}
if (s1 <s2)
return true;
return false;
}

Vector operator =(const Vector &B)
{
if (arr)
delete[] arr;
size = B.size;
arr = new int[size];
for (int i = 0; i < size; i++)
arr[i] = B.arr[i];
return *this;
}
bool operator ==(const Vector &B)
{
for (int i = 0; i < size; i++)
if (arr[i] != B.arr[i])
return false;
return true;
}
bool operator !=(const Vector &B)
{
for (int i = 0; i < size; i++)
if (arr[i] != B.arr[i])
return true;
return false;
}

};

class Iterator
{
int *m;
public:
friend Vector;
Iterator(int *a = 0) :m(a){}
bool operator ==(const Iterator & it)
{
return (m == it.m);
}
bool operator !=(const Iterator & it)
{
return (m != it.m);
}

Iterator operator ++();
Iterator operator --();
};

Iterator Vector::begin()
{
Iterator it(arr);
return it;
}
Iterator Vector::end()
{
Iterator it;
it.m = 0;
return it;
}
Iterator Iterator::operator ++()
{
return ++m;
}

Iterator Iterator::operator --()
{
return --m;
}
int main()
{
setlocale(LC_ALL, "Rus");
Vector A(4);
A.ScanV();
Vector B(A);
A.PrintV();
Iterator it(A.begin());
Iterator iter = A.begin();
while (iter != A.end())
{
iter++;
}

return 0;
}
Дополнен 5 лет назад
если лень читать, можно просто элементарно объяснить, как работает итератор
Голосование за лучший ответ
не я Ученик (154) 5 лет назад
Хоть бы ссылку на pastebin оставила. Это же читать невозможно
Drobisheva Veronika Знаток (418) 5 лет назад
это читать невозможно
Роман Protocol Мыслитель (8562) 5 лет назад
Я посмотрел, у тебя метод получения итератора на конец (end) возвращает всегда 00000000.
Зачем ты его зануляешь здесь?
it.m = 0;
Считывание с клавиатуры через scanf в методе ScanV() у тебя вместо 4 заданных просит 5. Я меняю на cin в этом плане всё нормально становится.
У тебя перегружены только префиксные формы инкремента и декремента, а ты вызываешь постфиксную перегрузку унарных операторов - программа сразу запускаться перестаёт.
Вот исправленный код, работает.
https://pastebin.com/cyZtrzSp
ЕвгенияУченик (103) 5 лет назад
спасибо огромное !!!
Роман Protocol Мыслитель (8562) Пожалуйста. Помолись, чтобы у меня по Дифференциальным уравнениям в ведомости за экзамен уже и далее стояло отлично.
Похожие вопросы