Wasn't error-proneness one of the reasons to avoid raw arrays? So why replace them with something that's only slightly less so?
It's not slightly less, it's far less. Computing indexes is easy. Implementing memory management, an STL interface and value semantics isn't. And one can still encapsulate the computation of indexes to make it trivial.
But anyway, we're comparing different things. For two-dimensional automatic arrays, the equivalent is a nested std::array, not std::vector.
I'd rather use boost::multi_array or something similar instead of a vector with manually recalculated indices.
boost::multi_array is buggy, on MSVC++ 2010 some operations
don't even compile.
By the way, why did you change your name?