Point to Pointer Array vs Vector of Vectors

Interested in making a program that reads in data files and dynamically allocates the contents (after setting the M x N of the matrix) of said files dynamically (i.e. never know how big they will be).

I have experience using std::vector's but recent came across something I hadn't seen before which was to declare an array such as double ** M. Came across this and this for some background information, but I still wonder:

why use ** over a std::vector<std::vector<double> > for a 2D dynamically allocated M?

The std::vector is already dynamically allocated (right?), so are the two pretty comparable (solely in terms of dynamic allocation). I did find another post comparing the too for further review.