Hai C++многомерный вектор
Как создать 2D вектор где как 2D массив
a[0][1]=98;
a[0][2]=95;
a[0][3]=99;
a[0][4]=910;
a[1][0]=98;
a[1][1]=989;
a[1][2]=981;
a[1][3]=987;
, как сделать то же самое в векторе? Спасибо заранее.
Hai C++многомерный вектор
Как создать 2D вектор где как 2D массив
a[0][1]=98;
a[0][2]=95;
a[0][3]=99;
a[0][4]=910;
a[1][0]=98;
a[1][1]=989;
a[1][2]=981;
a[1][3]=987;
, как сделать то же самое в векторе? Спасибо заранее.
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++ FAQ о предложении этой here
FAQ Lite ссылка сейчас [здесь] (http://www.parashift.com/c++-faq/matrix-array-of-array.html) – sumodds
std::vector< std::vector<int> > a;
//m * n is the size of the matrix
int m = 2, n = 4;
//Grow rows by m
a.resize(m);
for(int i = 0 ; i < m ; ++i)
{
//Grow Columns by n
a[i].resize(n);
}
//Now you have matrix m*n with default values
//you can use the Matrix, now
a[1][0]=98;
a[1][1]=989;
a[1][2]=981;
a[1][3]=987;
//OR
for(i = 0 ; i < m ; ++i)
{
for(int j = 0 ; j < n ; ++j)
{ //modify matrix
int x = a[i][j];
}
}
dribeas' действительно путь.
Чтобы указать причину, по которой вы, возможно, захотите перейти по маршруту operator(), считайте, что, например, если ваши данные разрежены, вы можете различать их по-другому, чтобы сэкономить место внутри, а operator() скрывает эту проблему внутренней реализации от ваш конечный пользователь дает вам лучшую инкапсуляцию и позволяет вам делать пространство или скорость, улучшая изменения во внутреннем макете позже, не нарушая ваш интерфейс.
Если вы не используете , используйте, чтобы использовать векторы, вы можете попробовать Boost.Multi_array. Вот краткий пример: link.
Как указано Ари, вектор < vector < int >> это правильный способ сделать это.
Кроме того, в таких случаях я всегда рассматриваю возможность упаковки внутреннего вектора (фактически, независимо от того, что он представляет) в классе, поскольку сложные структуры STL, как правило, становятся неуклюжими и запутанными.
Просто используйте следующий метод для использования двухмерного вектора.
int rows, columns; // . . . vector < vector <int> > Matrix(rows, vector<int>(columns,0)); Or vector < vector <int> > Matrix; Matrix.assign(rows, vector <int>(columns, 0)); // Do your stuff here...
Это позволит создать матрицу размера строк * столбцов и инициализирует его нулями, потому что мы проходим ноль (0) в качестве второго аргумента в конструктор, т.е. вектор < Int> (столбцы, 0).
дубликат: http://stackoverflow.com/questions/741190/multi-dimensional-array-c – lothar
Я не думаю, что это _exact_ duplicate. Этот вопрос касается особенностей использования векторов векторов, а не необработанной памяти. –