Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 505 — #543<br />
✐<br />
16.7. Introducción a los iteradores<br />
//: C16:IterStackTemplate.h<br />
// Simple stack template with nested iterator<br />
#ifndef ITERSTACKTEMPLATE_H<br />
#define ITERSTACKTEMPLATE_H<br />
#include "../require.h"<br />
#include <br />
template<br />
class StackTemplate {<br />
T stack[ssize];<br />
int top;<br />
public:<br />
StackTemplate() : top(0) {}<br />
void push(const T& i) {<br />
require(top < ssize, "Too many push()es");<br />
stack[top++] = i;<br />
}<br />
T pop() {<br />
require(top > 0, "Too many pop()s");<br />
return stack[--top];<br />
}<br />
class iterator; // Declaration required<br />
fri<strong>en</strong>d class iterator; // Make it a fri<strong>en</strong>d<br />
class iterator { // Now define it<br />
StackTemplate& s;<br />
int index;<br />
public:<br />
iterator(StackTemplate& st): s(st),index(0){}<br />
// To create the "<strong>en</strong>d s<strong>en</strong>tinel" iterator:<br />
iterator(StackTemplate& st, bool)<br />
: s(st), index(s.top) {}<br />
T operator*() const { return s.stack[index];}<br />
T operator++() { // Prefix form<br />
require(index < s.top,<br />
"iterator moved out of range");<br />
return s.stack[++index];<br />
}<br />
T operator++(int) { // Postfix form<br />
require(index < s.top,<br />
"iterator moved out of range");<br />
return s.stack[index++];<br />
}<br />
// Jump an iterator forward<br />
iterator& operator+=(int amount) {<br />
require(index + amount < s.top,<br />
" StackTemplate::iterator::operator+=() "<br />
"tried to move out of bounds");<br />
index += amount;<br />
return *this;<br />
}<br />
// To see if you’re at the <strong>en</strong>d:<br />
bool operator==(const iterator& rv) const {<br />
return index == rv.index;<br />
}<br />
bool operator!=(const iterator& rv) const {<br />
return index != rv.index;<br />
}<br />
505<br />
✐<br />
✐<br />
✐<br />
✐