std::vector< std::vector< int > > a; // as Ari pointed
Использование этого для растущей матрицы может стать сложным, поскольку система не гарантирует, что все внутренние векторы имеют одинаковый размер. Всякий раз, когда вы растете во втором измерении, вам придется явно увеличивать все векторы.
// grow twice in the first dimension
a.push_back( vector<int>() );
a.push_back( vector<int>() );
a[0].push_back( 5 ); // a[0].size() == 1, a[1].size()==0
Если с вами все в порядке (на самом деле это не матрица, а вектор векторов), с вами все будет в порядке. В противном случае вам нужно будет проявить особую осторожность, чтобы сохранить второе измерение стабильным по всем векторам.
Если вы планируете использовать матрицу фиксированного размера, вам следует рассмотреть возможность инкапсуляции в классе и переопределения оператора () вместо предоставления синтаксиса двойного массива. Прочитайте часто задаваемые вопросы C ++ относительно этого здесь