Neil Cerutti said:
Looking at the SGI library docs, slice_array does not provide
iterators, so valarray doesn't provide what he needs. He'll need
to roll his own, unless he doesn't mind making copies of the
items over which he iterates.
Also, Stroustrup provides an implementation for a Slice_iter class on
p.670 of _TC++PL:SE_ :
template <class T>
class Slice_iter {
valarray<T>* v;
slice s;
size_t curr; // index of current element
T& ref(size_t i) const { return (*v)[s.start() + i*s.stride()]; }
public:
Slice_iter(valarray<T>* vv, slice ss) : v(vv), s(ss), curr(0) { }
Slice_iter end() const
{
Slice_iter t = *this;
t.curr = s.size(); // index of last-plus-one element
return t;
}
Slice_iter& operator++() { curr++; return *this; }
Slice_iter operator++(int) { Slice_iter t = *this; curr++; return t; }
T& operator[](size_t i) { return ref(i); } // C style subscript
T& operator()(size_t i) { return ref(i); } // Fortran-style subscript
T& operator*() { return ref(curr); } // current element
friend bool operator==<>(const Slice_iter& p, const Slice_iter& q);
friend bool operator!=<>(const Slice_iter& p, const Slice_iter& q);
friend bool operator< <>(const Slice_iter& p, const Slice_iter& q);
};
template <class T>
bool operator==(const Slice_iter<T>& p, const Slice_iter<T>& q)
{
return p.curr == q.curr &&
p.s.stride() == q.s.stride() &&
p.s.start() == q.s.start();
}
template <class T>
bool operator!=(const Slice_iter<T>& p, const Slice_iter<T>& q)
{
return !(p == q);
}
template <class T>
bool operator<(const Slice_iter<T>& p, const Slice_iter<T>& q)
{
return p.curr < q.curr &&
p.s.stride() == q.s.stride() &&
p.s.start() == q.s.start();
}