2009-05-05 5 views
28

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; 

, как сделать то же самое в векторе? Спасибо заранее.

+0

дубликат: http://stackoverflow.com/questions/741190/multi-dimensional-array-c – lothar

+5

Я не думаю, что это _exact_ duplicate. Этот вопрос касается особенностей использования векторов векторов, а не необработанной памяти. –

ответ

31

vector<vector<int> > a;

+2

Как вы определяете строки и столбцы? – Rosenthal

+0

До вас, чтобы решить. – Ari

28
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

+1

FAQ Lite ссылка сейчас [здесь] (http://www.parashift.com/c++-faq/matrix-array-of-array.html) – sumodds

13
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]; 
    } 

} 
0

dribeas' действительно путь.

Чтобы указать причину, по которой вы, возможно, захотите перейти по маршруту operator(), считайте, что, например, если ваши данные разрежены, вы можете различать их по-другому, чтобы сэкономить место внутри, а operator() скрывает эту проблему внутренней реализации от ваш конечный пользователь дает вам лучшую инкапсуляцию и позволяет вам делать пространство или скорость, улучшая изменения во внутреннем макете позже, не нарушая ваш интерфейс.

6

Если вы не используете , используйте, чтобы использовать векторы, вы можете попробовать Boost.Multi_array. Вот краткий пример: link.

0

Как указано Ари, вектор < vector < int >> это правильный способ сделать это.

Кроме того, в таких случаях я всегда рассматриваю возможность упаковки внутреннего вектора (фактически, независимо от того, что он представляет) в классе, поскольку сложные структуры STL, как правило, становятся неуклюжими и запутанными.

0

Просто используйте следующий метод для использования двухмерного вектора.

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).

Смежные вопросы