2009-05-05 33 views
28

Hải C++đa chiều vector

Làm thế nào để tạo ra một vector 2D nơi ở như mảng 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; 

cách làm tương tự trong vector? Cảm ơn bạn trước.

+0

trùng lặp ?: http://stackoverflow.com/questions/741190/multi-dimensional-array-c – lothar

+5

Tôi không nghĩ đó là một bản sao _exact_. Câu hỏi này là về các chi tiết cụ thể của việc sử dụng vectơ của vectơ và không phải bộ nhớ thô. –

Trả lời

31

vector<vector<int> > a;

+2

Cách bạn xác định hàng và cột? – Rosenthal

+0

Tùy thuộc vào quyết định của bạn. – Ari

28
std::vector< std::vector<int> > a; // as Ari pointed 

Sử dụng này cho một ma trận phát triển có thể trở nên phức tạp, như hệ thống sẽ không đảm bảo rằng tất cả các vectơ nội bộ là có cùng kích thước. Bất cứ khi nào bạn phát triển trên chiều thứ hai, bạn sẽ phải phát triển rõ ràng tất cả các vectơ.

// 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 

Nếu điều đó tốt với bạn (nó không thực sự là ma trận mà là vec-tơ vectơ), bạn nên ổn. Khác bạn sẽ cần phải đặt thêm chăm sóc để giữ cho chiều thứ hai ổn định trên tất cả các vectơ.

Nếu bạn đang lập kế hoạch trên ma trận kích thước cố định, thì bạn nên xem xét đóng gói trong một lớp và toán tử ghi đè() thay vì cung cấp cú pháp mảng kép. Hãy đọc Câu Hỏi Thường Gặp về C++ về số điện thoại here

+1

Câu hỏi thường gặp Liên kết Lite hiện là [tại đây] (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 'này thực sự là cách để thực hiện.

Chỉ cần đưa ra lý do tại sao bạn có thể muốn sử dụng toán tử(), ví dụ: nếu dữ liệu của bạn thưa thớt, bạn có thể đặt nó khác nhau để tiết kiệm không gian bên trong và toán tử() ẩn vấn đề triển khai nội bộ đó người dùng cuối của bạn cho phép bạn đóng gói tốt hơn và cho phép bạn tạo không gian hoặc tăng tốc các thay đổi đối với bố cục bên trong sau này mà không làm hỏng giao diện của bạn.

6

Nếu bạn không để sử dụng véc tơ, bạn có thể muốn thử Boost.Multi_array. Dưới đây là một ví dụ link.

0

Khi Ari chỉ, vector < vector < int >> là cách phù hợp để thực hiện. Thêm vào đó, trong những trường hợp như vậy, tôi luôn xem xét gói vector bên trong (thực ra, bất kể nó đại diện) trong một lớp, bởi vì các cấu trúc STL phức tạp có xu hướng trở nên vụng về và khó hiểu.

0

Chỉ cần sử dụng phương pháp sau để sử dụng véc tơ 2-D.

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

này sẽ tạo ra một ma trận hàng kích thước * cột và khởi tạo nó với số không bởi vì chúng tôi đang đi qua một số không (0) như là một đối số thứ hai trong các nhà xây dựng tức là vector < int> (cột, 0).