Форум программистов, компьютерный форум CyberForum.ru

Реализовать итератор для самодельного списка - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Все необходимые данные для функций должны передаваться им в качестве параметров http://www.cyberforum.ru/cpp-beginners/thread843717.html
Как переделать код, для того, что бы все необходимые данные для функций передавались им в качестве параметров. Использование глобальных переменных в функциях запрещается. #include<iostream> #include<stdio.h> #include<fstream> #include<conio.h> #include<vector> #include<string> #include<Windows.h> using namespace std;
C++ У кого какие творения? Вот кто сейчас хорошо разбирается в C++, кто что написал такого фенаменального? http://www.cyberforum.ru/cpp-beginners/thread843694.html
C++ Задача прямоугольная матрица / шаблоны функций
дана прямоугольная матрица, используя шаблон функций найти: количество отрицательных элементов в тех строках, которые содержат хотя бы один нулевой элемент; сумму модулей элементов, расположенных после первого положительного элемента; хелп плиз в с++ не особо шарю а тут залетела лаба ((
C++ программа C++
// iostream standard header for Microsoft #pragma once #ifndef _IOSTREAM_ #define _IOSTREAM_ #ifndef RC_INVOKED #include <istream> #ifdef _MSC_VER #pragma pack(push,_CRT_PACKING) #pragma warning(push,3)
C++ Морзе http://www.cyberforum.ru/cpp-beginners/thread843678.html
Доброго времени суток, хотелось бы проконсультироваться у мастеров... Суть вопроса такова: Имеется рабочий код, но программа не переводит символы после пробела... P.S. Программа перевода чисел, слов и т.д. в азбуку морзе (.,-). #include <iostream.h> #include <string.h> #include <conio.h> #include <stdio.h> int convert2 (char); int strlen2 (char *s) {
C++ Вывод всех слов текста в алфавитном порядке Здравствуйте! Помогите написать прогу в с++ которая выводит все слова текста в алфавитном порядке подробнее

Показать сообщение отдельно
lemegeton
 Аватар для lemegeton
2913 / 1342 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
21.04.2013, 01:07     Реализовать итератор для самодельного списка
Итератор это такой шаблон проектирования. Пишется некий класс, с помощью объектов которого можно получать последовательный доступ к содержимому объекта-контейнера.
В С++ все особо цинично, поскольку можно перегружать "+" и "-", позволяя очень читабельно работать с итераторами.
Итераторы часто используются в C++ STL.


Пример самописного итератора (вместе с контейнером двусвязного списка):
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
#include <cstdlib>
#include <ctime>
#include <iostream>
 
struct ListNodeBase {
  ListNodeBase *prev, *next;
  ListNodeBase() : prev(this), next(this) {}
  ListNodeBase(ListNodeBase *prev, ListNodeBase *next) : prev(prev), next(next) {
    next->prev = prev->next = this;
  }
  virtual ~ListNodeBase() {
    next->prev = prev;
    prev->next = next;
  }
};
 
template <class T>
struct ListNode : public ListNodeBase {
  T value;
  ListNode(ListNodeBase *prev, ListNodeBase *next, const T &value)
    : ListNodeBase(prev, next), value(value) {}
};
 
struct ListIteratorBase {
  ListIteratorBase() : node(0) {}
  ListIteratorBase(ListNodeBase *node) : node(node) {}
  
  void increment() { node = node->next; }
  void decrement() { node = node->prev; }
  
  bool operator==(const ListIteratorBase &other) const {
    return node == other.node;
  }
  bool operator!=(const ListIteratorBase &other) const {
    return node != other.node;
  }
  ListNodeBase *node;
};
 
 
// двусторонний итератор
template <class ValueType, class PointerType, class ReferenceType>
struct ListIterator : public ListIteratorBase {
  typedef ValueType           Value;
  typedef PointerType         Pointer;
  typedef ReferenceType       Reference;
  typedef ListNode<ValueType> Node;
  typedef ListIterator<ValueType, PointerType, ReferenceType> Self;
  typedef ListIterator<ValueType, ValueType*, ValueType&> Iterator;
  typedef ListIterator<ValueType, const ValueType*,
    const ValueType&> ConstIterator;
  
  ListIterator() : ListIteratorBase() {}
  ListIterator(const Iterator &other) : ListIteratorBase(other.node) {}
  ListIterator(ListNodeBase *node) : ListIteratorBase(node) {}
  
  Reference operator*() const { return ((Node*)node)->value; }
  Pointer operator->() const { return &(operator*()); }
 
  Self &operator++() {
    increment();
    return *this;
  }
  Self &operator--() {
    decrement();
    return *this;
  }
  Self &operator++(int) {
    Self result = *this;
    increment();
    return result;
  }
  Self &operator--(int) {
    Self result = *this;
    decrement();
    return result;
  }
  
};
 
// итератор добавления в конец списка
template <class Container>
struct BackInsertIterator {
 protected:
  Container &container;
 public:
  typedef void Value;
  typedef void Pointer;
  typedef void Reference;
  explicit BackInsertIterator(Container &container)
    : container(container) {}
  BackInsertIterator &operator=(const typename Container::Value &value) {
    container.pushBack(value);
    return *this;
  }
  BackInsertIterator &operator*() { return *this; }
  BackInsertIterator &operator++() { return *this; }
  BackInsertIterator &operator++(int) { return *this; }
};
 
// удобная функция для создания итератора добавления
template <class Container>
BackInsertIterator<Container> getBackInserter(Container &container) {
  return BackInsertIterator<Container>(container);
}
 
template <class T>
class List {
 public:
  typedef T Value;
  typedef T* Pointer;
  typedef T& Reference;
  typedef ListIterator<T, T*, T&> Iterator;
  typedef ListIterator<T, const T*, const T&> ConstIterator;
  
  List() : size(0), base() {}
  List(const List &other) : size(0), base() {
    insert(other.begin(), other.end());
  }
  List &operator=(const List &other) {
    if (this != &other) {
      clear();
      insert(other.begin(), other.end());
    }
    return *this;
  }
  virtual ~List() {
    clear();
  }
  
  Iterator begin() { return (Node*)(base.next); }
  ConstIterator begin() const { return (Node*)(base.next); }
  Iterator end() { return (Node*)(&base); }
  ConstIterator end() const { return (Node*)(&base); }
  
  Iterator insert(Iterator position, const T &value) {
    ++size;
    return new Node(position.node->prev, position.node, value);
  }
  void insert(Iterator position, Iterator first, Iterator last) {
    while (first != last) {
      position = insert(position, *first++);
      ++position;
    }
  }
  Iterator erase(Iterator position) {
    Iterator next = position.node->next;
    delete position.node;
    -- size;
    return next;
  }
  Iterator erase(Iterator first, Iterator last) {
    while (first != last) {
      first = erase(first);
    }
    return first;
  }
  Iterator pushBack(const T &value) {
    return insert(end(), value);
  }
  Iterator pushFront(const T &value) {
    return insert(begin(), value);
  }
  bool isEmpty() const { return base.next == &base; }
  void clear() {
    while (!isEmpty()) {
      delete base.next;
    }
    size = 0;
  }
 private:
  typedef ListNode<T> Node;
  size_t size;
  ListNodeBase base;
};
 
template <class OutputIterator, class Size, class Generator>
void generateN(OutputIterator first, Size n, Generator generator) {
  while (n-- > 0) {
    *first++ = generator();
  }
}
 
 
struct RandomGenerator {
  int min, max;
  RandomGenerator(int min, int max) : min(min), max(max) {}
  int operator()() { return rand() % (max - min) + min; }
};
 
int main(int argc, char **argv) {
  srand(time(0));
 
  List<int> list;
 
  // генерация десяти случайных чисел с добавлением в конец контейнера
  generateN(getBackInserter(list), 10, RandomGenerator(0, 10));
 
  // вывод контейнера на экран  
  for (List<int>::ConstIterator i = list.begin(); i != list.end(); ++i) {
    std::cout << *i << std::endl;
  }
  
  return 0;
}
 
Текущее время: 19:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru