Note that also you can use boost.ublas for matrix creation and manipulation and also boost.graph to represent and manipulate graphs in a number of ways, as well as using algorithms on them, etc.
Edit: Anyway, doing a range-check version of a vector for your purposes is not a hard thing:
template <typename T> class BoundsMatrix { std::vector<T> inner_; unsigned int dimx_, dimy_; public: BoundsMatrix (unsigned int dimx, unsigned int dimy) : dimx_ (dimx), dimy_ (dimy) { inner_.resize (dimx_*dimy_); } T& operator()(unsigned int x, unsigned int y) { if (x >= dimx_ || y>= dimy_) throw std::out_of_range("matrix indices out of range"); // ouch return inner_[dimx_*y + x]; } };
Note that you would also need to add the const version of the operators, and/or iterators, and the strange use of exceptions, but you get the idea.