Provide a template to create STL-compliant random access iterators.
More...
Detailed Description
- Outline
-
-
- Purpose:
- Provide a template to create STL-compliant random access iterators.
-
- Classes:
-
- Canonical Header:
- bsl_iterator.h
- See also:
- Component bslstl_iterator, Component bslstl_forwarditerator, Component bslstl_bidirectionaliterator
-
- Description:
- This component provides an iterator adaptor that, given an implementation class defining a core set of iterator functionality specified in the class level documentation, adapts it to provide an STL-compliant random access iterator interface.
bslstl::RandomAccessIterator
meets the requirements of a random access iterator described in the C++11 standard [24.2.7] under the tag "[random.access.iterators]". Include bsl_iterator.h to use this component.
-
- Usage:
- In this section we show intended use of this component.
-
- Example 1: Defining a Standard Compliant Random Access Iterator:
- Suppose we want to create a standard compliant random access iterator for a container.
- First, we define an iterator,
MyArrayIterator
, that meets the requirements of the IMP_ITER
template parameter of RandomAccessIterator
class (see class level documentation), but does not meet the full set of requirements for a random access iterator as defined by the C++ standard. Note that the following shows only the public interface required. Private members and additional methods that may be needed to implement this class are elided in this example: template <class VALUE>
class MyArrayIterator {
public:
MyArrayIterator();
MyArrayIterator(const MyArrayIterator& original);
~MyArrayIterator();
MyArrayIterator& operator=(const MyArrayIterator& rhs);
void operator++();
void operator--();
void operator+=(std::ptrdiff_t n);
void operator-=(std::ptrdiff_t n);
VALUE& operator*() const;
};
template <class VALUE>
bool operator==(const MyArrayIterator<VALUE>&,
const MyArrayIterator<VALUE>&);
template <class VALUE>
bool operator<(const MyArrayIterator<VALUE>&,
const MyArrayIterator<VALUE>&);
template <class VALUE>
std::ptrdiff_t operator-(const MyArrayIterator<VALUE>&,
const MyArrayIterator<VALUE>&);
Notice that MyArrayIterator
does not implement a complete standard compliant random access iterator. It is missing methods such as operator+
and operator[]
.
- Then, we define the interface for our container class template,
MyFixedSizeArray
. The implementation of the interface is elided for brevity: template <class VALUE, int SIZE>
class MyFixedSizeArray {
VALUE d_array[SIZE];
public:
typedef VALUE value_type;
Now, we use RandomAccessIterator
to create a standard compliant iterator for this container: Notice that the implementation for const_iterator
is MyArrayIterator<VALUE>
and not MyArrayIterator<const VALUE>
.
- Next, we continue defining the rest of the class.
iterator begin();
iterator end();
VALUE& operator[](std::ptrdiff_t position);
const_iterator begin() const;
const_iterator end() const;
const VALUE& operator[](std::ptrdiff_t position) const;
};
Then, we create a MyFixedSizeArray
and initialize its elements: MyFixedSizeArray<int, 5> fixedArray;
fixedArray[0] = 3;
fixedArray[1] = 2;
fixedArray[2] = 5;
fixedArray[3] = 4;
fixedArray[4] = 1;
Finally, to show that MyFixedSizeArray::iterator
can be used as a random access iterator, we invoke a function that takes random iterators as parameters, such as std::sort
, on the begin
and end
iterators and verify the results: std::sort(fixedArray.begin(), fixedArray.end());
assert(fixedArray[0] == 1);
assert(fixedArray[1] == 2);
assert(fixedArray[2] == 3);
assert(fixedArray[3] == 4);
assert(fixedArray[4] == 5);