Two common approaches to this issue are an array of pointers and a vector of vectors. One advantage with vectors is that initial allocation and run-time expansion of a dimension is handled under-the-covers for you. If the size of each dimension is fixed at run time, this wouldn't be an issue. In either case, typedef helps significantly.
Using vectors, start with the type (not an object) vector of strings. Then create the type vector of the first type. And finally create the type vector of the second type. In code this looks like
typedef vector<string> dimension_1;
typedef vector<dimension_1> dimension_2;
typedef vector<dimension_2> dimension_3;
Once you have calculated the size of the dimensions (max_1, max_2, max_3), you can create and size the object with
dimension_3 myarray(max_1);
for (int i=0; i<max_1;i++)
{
myarray[i].resize(max_2);
for (int j=0; j<max_2; j++)
myarray[i][j].resize(max_3);
}
Now you can access any element of the 3D array with myarray[x][y][z].
A similar approach works with arrays but yu have to perform all the allocations yourself.