Mercurial > Algorithms__Sedgewick
comparison algs4-c++/src/Deque.cpp @ 27:80ca1973e3bd
Fleshed out Queue::generic_iterator a bit more to make it a more or less complete example of implmenting an iterator.
author | Eris Caffee <discordia@eldalin.com> |
---|---|
date | Tue, 23 Jun 2015 17:14:09 -0500 |
parents | 1e3c509b6ac4 |
children |
comparison
equal
deleted
inserted
replaced
0:c41347541319 | 1:a12aa9be8f23 |
---|---|
1 // g++ -D DEQUE_MAIN -std=c++0x Deque.cpp | 1 // g++ -std=c++11 Deque.cpp |
2 // g++ -D DEQUE_MAIN -std=c++11 Deque.cpp | |
3 | 2 |
4 | 3 |
5 #include "Deque.hpp" | 4 #include "Deque.hpp" |
6 | |
7 #include <cassert> | |
8 #include <cstddef> | |
9 | |
10 #include <iostream> | |
11 | |
12 template <typename T> | |
13 Deque<T>::Deque( void ) : | |
14 N (0), | |
15 first (nullptr), | |
16 last (nullptr) | |
17 { | |
18 } | |
19 | |
20 template <typename T> | |
21 Deque<T>::~Deque( void ) { | |
22 assert( N == 0 ); // Catch the potential memory leak. | |
23 while ( first ) { | |
24 Node *next = first->next; | |
25 delete first; | |
26 first = next; | |
27 } | |
28 } | |
29 | |
30 template <typename T> | |
31 void Deque<T>::push_right( T &item ) { | |
32 Node * node = new Node(); | |
33 node->item = item; | |
34 node->next = nullptr; | |
35 node->prev = nullptr; | |
36 | |
37 if ( last ) { | |
38 last->next = node; | |
39 node->prev = last; | |
40 last = node; | |
41 } | |
42 else { | |
43 last = first = node; | |
44 } | |
45 | |
46 N++; | |
47 } | |
48 | |
49 template <typename T> | |
50 void Deque<T>::push_left( T &item ) { | |
51 Node * node = new Node(); | |
52 node->item = item; | |
53 node->next = nullptr; | |
54 node->prev = nullptr; | |
55 | |
56 if ( first ) { | |
57 node->next = first; | |
58 first->prev = node; | |
59 first = node; | |
60 } | |
61 else { | |
62 last = first = node; | |
63 } | |
64 | |
65 N++; | |
66 } | |
67 | |
68 template <typename T> | |
69 T Deque<T>::pop_left( void ) { | |
70 assert( N > 0 ); | |
71 | |
72 T item = first->item; | |
73 | |
74 Node *old = first; | |
75 if ( first->next ) | |
76 first->next->prev = nullptr; | |
77 first = first->next; | |
78 delete old; | |
79 N--; | |
80 | |
81 if ( ! first ) | |
82 last = nullptr; | |
83 | |
84 return item; | |
85 } | |
86 | |
87 template <typename T> | |
88 T Deque<T>::pop_right( void ) { | |
89 assert( N > 0 ); | |
90 | |
91 T item = last->item; | |
92 | |
93 Node *old = last; | |
94 if ( last->prev ) | |
95 last->prev->next = nullptr; | |
96 last = last->prev; | |
97 delete old; | |
98 N--; | |
99 | |
100 if ( ! last ) | |
101 first = nullptr; | |
102 | |
103 return item; | |
104 } | |
105 | |
106 template <typename T> | |
107 bool Deque<T>::is_empty( void ) { | |
108 return N == 0; | |
109 } | |
110 | |
111 template <typename T> | |
112 size_t Deque<T>::size( void ) { | |
113 return N; | |
114 } | |
115 | |
116 template <typename T> | |
117 typename Deque<T>::iterator Deque<T>::begin( void ) { | |
118 return Deque<T>::iterator( first ); | |
119 } | |
120 | |
121 template <typename T> | |
122 typename Deque<T>::iterator Deque<T>::end( void ) { | |
123 return Deque<T>::iterator( nullptr ); | |
124 } | |
125 | |
126 | |
127 //////////////////////////////////////////////////////////////////////////////// | |
128 | |
129 template <typename T> | |
130 Deque<T>::iterator::iterator( Node *c ) : | |
131 curr (c) | |
132 { | |
133 } | |
134 | |
135 template <typename T> | |
136 typename Deque<T>::iterator & Deque<T>::iterator::operator++() { | |
137 if ( this->curr != nullptr ) { | |
138 this->curr = this->curr->next; | |
139 } | |
140 return *this; | |
141 } | |
142 | |
143 template <typename T> | |
144 typename Deque<T>::iterator Deque<T>::iterator::operator++( int ) { | |
145 auto t = Deque<T>::iterator( *this ); | |
146 | |
147 if ( this->curr != nullptr ) { | |
148 this->curr = this->curr->next; | |
149 } | |
150 return t; | |
151 } | |
152 | |
153 template <typename T> | |
154 T Deque<T>::iterator::operator*() { | |
155 return this->curr->item; | |
156 } | |
157 | |
158 template <typename T> | |
159 bool Deque<T>::iterator::operator!=( typename Deque<T>::iterator other ) { | |
160 return this->curr != other.curr; | |
161 } | |
162 | |
163 | |
164 //////////////////////////////////////////////////////////////////////////////// | |
165 | |
166 #ifdef DEQUE_MAIN | |
167 | 5 |
168 #include <iostream> | 6 #include <iostream> |
169 | 7 |
170 int main ( int argc, char **argv ) { | 8 int main ( int argc, char **argv ) { |
171 | 9 |
209 } | 47 } |
210 | 48 |
211 std::cout << "Deque has " << deque.size() << " entries." << std::endl; | 49 std::cout << "Deque has " << deque.size() << " entries." << std::endl; |
212 | 50 |
213 } | 51 } |
214 | |
215 #endif |