Iterators - Iowa State Universityweb.cs.iastate.edu/~lumpe/CS229/Iterators.pdfAbilities of Iterators...
Transcript of Iterators - Iowa State Universityweb.cs.iastate.edu/~lumpe/CS229/Iterators.pdfAbilities of Iterators...
119
Iterators
Input Iterator Output Iterator
Forward Iterator
Random Access Iterator
Bidirectional Iterator
120
Abilities of Iterators
Read and write withrandom access
Random accessiterator
list, set, multiset,map, multimap,vector, deque, string,array
Read and writeforward and backwardBidirectional iterator
Read and writeforwardForward iterator
ostream, inserterWrite forwardOutput iterator
istreamRead forwardInput iterator
ProviderAbilityIterator Category
121
Input Iterator
Copies iterator (copy contructor)TYPE(iter)
Returns whether iter1 and iter2 are not equaliter1 != iter2
Returns whether iter1 and iter2 are equaliter1 == iter2
Steps forward (returns old position)iter++
Steps forward (returns new position)++iter
Provides read access to a member of the actual elementiter->member
Provides read access to the actual element*iterEffectExpression
122
Output Iterator
Copies iterator (copy contructor)TYPE(iter)
Steps forward (returns old position)iter++
Steps forward (returns new position)++iterWrites value to the actual element*iter = value
EffectExpression
An output iterator is like a “black hole”.
123
Forward Iterator
Assigns an iteratoriter1 = iter2
Creates iterator (default constructor)TYPE()
Copies iterator (copy contructor)TYPE(iter)
Returns whether iter1 and iter2 are not equaliter1 != iter2
Returns whether iter1 and iter2 are equaliter1 == iter2
Steps forward (returns old position)iter++
Steps forward (returns new position)++iter
Provides read access to a member of the actual elementiter->member
Provides read access to the actual element*iterEffectExpression
124
Bidirectional Iterator
Steps backward (returns old position)iter--
Steps backward (returns new position)--iter
Assigns an iteratoriter1 = iter2
Creates iterator (default constructor)TYPE()
Copies iterator (copy contructor)TYPE(iter)
Returns whether iter1 and iter2 are not equaliter1 != iter2
Returns whether iter1 and iter2 are equaliter1 == iter2
Steps forward (returns old position)iter++
Steps forward (returns new position)++iter
Provides read access to a member of the actual elementiter->member
Provides read access to the actual element*iterEffectExpression
125
Random Access Iterator
Returns whether iter1 is not before iter2iter1 >= iter2Returns whether iter1 is not after iter2iter1 <= iter2Returns whether iter1 is after iter2iter1 > iter2Returns whether iter1 is before iter2iter1 < iter2
Returns distance between iter1 and iter2 are not equaliter1 - iter2
Returns the iterator of the nth previous elementiter-n
Returns the iterator of the nth next elementn+iter
Steps n elements backward or forwarditer-= n
Steps n elements forward or backwarditer+= n
Provides read access to element at index niter[n]
EffectExpression
126
Class HuffmanBitCode
class HuffmanBitCode{private:
byte* fBitArray;unsigned int fCodeLength;
void copy( const HuffmanBitCode& aCode );void extend( int aToCodeLength );void copy( byte aBitArray[], int aCodeLength );
…};
127
Class HuffmanBitCodeclass HuffmanBitCode{
…
public:HuffmanBitCode();HuffmanBitCode( byte aBitArray[], int aCodeLength );HuffmanBitCode( const HuffmanBitCode& aBitCode );~HuffmanBitCode();
class iterarator { … };
unsigned int size() const;byte* getBits() const;int lengthInByte() const;void add0();void add1();HuffmanBitCode& operator=( const HuffmanBitCode& aBitCode ); // required bc copy constructorint at( unsigned int aIndex ) const;int operator[]( unsigned int aIndex ) const;iterator begin();iterator end();
};
128
Class HuffmanBitCode::iterator
// HuffmanBitCode::iterator
class iterator{
friend class HuffmanBitCode;
private:HuffmanBitCode* fCode;unsigned int fIndex;
// follow singleton pattern (constructor should not be public)protected:
iterator();iterator( HuffmanBitCode* aCode );iterator( HuffmanBitCode* aCode, unsigned int aPosition );…
};
129
Class HuffmanBitCode::iterator
// HuffmanBitCode::iterator
class iterator{
…public:
// Iterator behaviorint operator*() const;iterator& operator++(); // prefixiterator operator++(int);// postix (extra unused argument)bool operator==( const iterator& ) const;bool operator!=( const iterator& ) const;
// non-standard iterator method to obtain a cloned enditerator end();iterator next();
};
130
HuffmanBitCode::iterator::operator++()
HuffmanBitCode::iterator&HuffmanBitCode::iterator::operator++()
{fIndex++;return *this;
}
131
HuffmanBitCode::iterator::operator++(int)
HuffmanBitCode::iteratorHuffmanBitCode::iterator::operator++(int)
{iterator lTemp = *this;fIndex++;return lTemp;
}
132
HuffmanBitCode::iterator::operator==()
bool HuffmanBitCode::iterator::operator==( const iterator& aOther ) const
{return (fCode == aOther.fCode) &&
(fIndex == aOther.fIndex);}
133
HuffmanBitCode::iterator::operator!=()
bool HuffmanBitCode::iterator::operator!=( const iterator& aOther ) const
{return !(*this == aOther);
}
134
HuffmanBitCode::iterator::end()
HuffmanBitCode::iteratorHuffmanBitCode::iterator::end()
{return
iterator( fCode, fCod->fCodeLength );}
135
HuffmanBitCode::iterator::next()
HuffmanBitCode::iteratorHuffmanBitCode::iterator::next()
{return iterator( fCode, fIndex + 1 );
}
136
HuffmanBitCode::begin()
HuffmanBitCode::iterator HuffmanBitCode::begin(){
return iterator( this );}
137
HuffmanBitCode::end()
HuffmanBitCode::iterator HuffmanBitCode::end(){
return iterator( this, fCodeLength );}