In this version, we add a slicing operator. The slicing operator constructs a new vector that shares data elements with the original vector, but has a limited range of indexes.
// // Vector2.C // // A. B. Maccabe 3/10/97 // // A simple vector class -- illustrates overloading the index operator // with array bounds checking // // // this example adds the ability to take a slice from the vector. // #include <assert.h> #include <iostream.h> class Vector { public: // constructor Vector( int lower, int upper ) { lb = lower; ub = upper; data = new double[upper-lower+1]; }; double& operator[] ( int indx ) { assert( lb<=indx && indx<=ub ); return data[indx-lb]; }; friend ostream& operator << ( ostream &os, Vector v ) { for( int i = v.lb ; i <= v.ub ; i++ ) { os << i << ':' << v.data[i-v.lb] << ' '; } return os; } Vector slice( int lower, int upper ) { assert( lower<=upper && lb<=lower && upper<=ub ); return Vector( &data[lower-lb], lower, upper ); }; private: // private constructor Vector( double *dat, int lower, int upper ) { data = dat; lb = lower; ub = upper; }; int lb, ub; double *data; }; int main() { Vector v( 10, 20 ); for( int i = 10 ; i <= 20 ; i++ ) { v[i] = i; } cout << v << endl; // construct a simple slice Vector v2 = v.slice( 15, 18 ); cout << v2 << endl; v2[16] = -16; cout << v << endl; // now, take a slice of a slice Vector v3 = v2.slice( 16, 17 ); cout << v3 << endl; v3[17] = -17; cout << v << endl; }