13.01.2015 Views

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

SHOW MORE
SHOW LESS

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 />

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!