-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy patharray_iterator.h
107 lines (86 loc) · 4.21 KB
/
array_iterator.h
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
#ifndef EASY_ALGORITHM_ARRAY_ITERATOR_H
#define EASY_ALGORITHM_ARRAY_ITERATOR_H
#include <iosfwd>
#include<iostream>
#include "iterator.h"
namespace easy_algorithm {
template <class Item>
class ArrayIterator : public Iterator<Item> { // Класс - итератор для массивов
public:
ArrayIterator(const Iterator<Item>& iter); // Конструктор копирования. Создает итератор идентичный iter
ArrayIterator(Item* item); // Конструктор с параметром, на какой элемент указывать
virtual ~ArrayIterator(); // Виртуальный деструктор позволяет полиморфное удаление объектов
ArrayIterator(); // Конструктор по умолчанию
private:
virtual std::ostream& vPrint(std::ostream& os, const Iterator<Item>& iter) const; // Вывод значения элемента в поток
virtual std::istream& vInput(std::istream& is, Iterator<Item>& ds); // Ввод значения элемента из потока
virtual Iterator<Item>& vIncrease(); // Соответствует operator ++
virtual Iterator<Item>& vDecrease(); // Соответствует operator --
virtual const Iterator<Item>& vSeekIter(ptrdiff_t diff); // Соответствует operator +=, operator -=
virtual const Iterator<Item>& vAssign(const Iterator<Item>& iter); // Соответствует = iter
virtual Iterator<Item>& vInsert(const Item& item); // Соответствует = item
virtual void vSwap(Iterator<Item>& iter); // Соответствует swap
virtual ptrdiff_t vDiff(const Iterator<Item>& iter); // Соответствует operator -
protected:
using Iterator<Item>::_pItem; // Указатель на элемент, на который ссылается итератор
};
template <class Item>
ArrayIterator<Item>::ArrayIterator() : Iterator<Item>() {}
template <class Item>
ArrayIterator<Item>::~ArrayIterator() {}
template <class Item>
ArrayIterator<Item>::ArrayIterator(Item* item) : Iterator<Item>() {
_pItem = item;
}
template <class Item>
ArrayIterator<Item>::ArrayIterator(const Iterator<Item>& iter) : Iterator<Item>(iter) {}
template <class Item>
std::ostream& ArrayIterator<Item>::vPrint(std::ostream& os, const Iterator<Item>& iter) const {
os << *iter; // Вывод элемента, на который указывает итератор
return os;
}
template <class Item>
std::istream& ArrayIterator<Item>::vInput(std::istream& is, Iterator<Item>& iter) {
Item temp;
is >> temp;
if(!(is.rdstate() & std::ios::failbit))
iter = temp; // Присваивание элементу, на который указывает итератор, значения из входного потока
return is;
}
template <class Item>
Iterator<Item>& ArrayIterator<Item>::vIncrease() {
++_pItem;
return *this;
}
template <class Item>
Iterator<Item>& ArrayIterator<Item>::vDecrease() {
--_pItem;
return *this;
}
template <class Item>
const Iterator<Item>& ArrayIterator<Item>::vSeekIter(ptrdiff_t diff) {
_pItem += diff;
return *this;
}
template <class Item>
const Iterator<Item>& ArrayIterator<Item>::vAssign(const Iterator<Item>& iter) {
_pItem = iter.getPointer();
return *this;
}
template <class Item>
Iterator<Item>& ArrayIterator<Item>::vInsert(const Item& item) {
*_pItem = item;
return *this;
}
template <class Item>
void ArrayIterator<Item>::vSwap(Iterator<Item>& iter) {
Item* temp = _pItem;
_pItem = iter.getPointer();
iter.setPointer(temp);
}
template <class Item>
ptrdiff_t ArrayIterator<Item>::vDiff(const Iterator<Item>& iter) {
return (_pItem - iter.getPointer()) / sizeof(Item);
}
}
#endif