2010-02-27 22 views
5

Tôi đang cố gắng làm việc với vectơ của vectơ ints cho bộ giải đố sudoku mà tôi đang viết.Làm cách nào để làm việc với vectơ lồng nhau trong C++?

Câu hỏi 1:

Nếu tôi sẽ truy cập vào một vector 2ngày của tôi bằng cách chỉ số, tôi phải khởi tạo nó với kích thước thích hợp đầu tiên?

Ví dụ:

typedef vector<vector<int> > array2d_t; 

void readAPuzzle(array2d_t grid) 
{ 
    for(int i = 0; i < 9; i++) 
     for(int j = 0; j < 9; j++) 
      cin >> grid[i][j]; 
    return; 
} 

int main() 
{ 
    array2d_t grid; 
    readAPuzzle(grid); 
} 

sẽ seg lỗi. Tôi cho rằng điều này là bởi vì nó đang cố gắng truy cập vào các tầng lớp chưa được khởi tạo?

Tôi đã hoán đổi dòng khai lưới với:

array2d_t grid(9, vector<int>(9, 0)); 

Và điều này dường như để thoát khỏi lỗi seg này. Đây có phải là cách đúng để xử lý nó?

Câu hỏi 2:

Tại sao khi tôi cố gắng đọc vào lưới của tôi từ cin, và sau đó in ra lưới điện, lưới điện là trống?

Tôi đang sử dụng đoạn mã sau để làm như vậy:

void printGrid(array2d_t grid) 
{ 
    for (int i = 0; i < 9; i++) 
    { 
     for (int j = 0; j < 9; j++) 
     { 
      cout << grid[i][j] + " "; 
     } 
     cout << endl; 
    } 
} 

void readAPuzzle(array2d_t grid) 
{ 
    for(int i = 0; i < 9; i++) 
     for(int j = 0; j < 9; j++) 
      cin >> grid[i][j]; 

    return; 
} 

int main() 
{ 
    array2d_t grid(9, vector<int>(9, 0)); 
    printGrid(grid); 
    readAPuzzle(grid); 
    printGrid(grid); 
} 

Và tôi cố gắng để chạy chương trình của tôi như:

./a.out < sudoku-test 

đâu sudoku-test là một tập tin chứa những điều sau đây:

3 0 0 0 0 0 0 0 0 
5 8 4 0 0 2 0 3 0 
0 6 0 8 3 0 0 7 5 
0 4 1 0 0 6 0 0 0 
7 9 0 0 2 0 0 5 1 
0 0 0 9 0 0 6 8 0 
9 3 0 0 1 5 0 4 0 
0 2 0 4 0 0 5 1 8 
0 0 0 0 0 0 0 0 6 

Cuộc gọi đầu tiên để inGrid() cung cấp một lưới trống, khi thay vào đó, tôi sẽ thấy lưới 9x9 0 vì đó là cách tôi khởi tạo nó. Cuộc gọi thứ hai nên chứa lưới ở trên. Tuy nhiên, cả hai lần trống.

Có ai có thể làm sáng tỏ điều này không?

+0

thanh toán boost.multi_array nếu bạn muốn cách dễ dàng hơn để đối phó với các dữ liệu đa chiều động – Anycorn

Trả lời

5

Q1: Có, đó là cách chính xác để xử lý. Tuy nhiên, lưu ý rằng vectơ lồng nhau là một cách khá hiệu quả để triển khai mảng 2D. Một vector và các chỉ số tính toán theo số x + y * width thường là một lựa chọn tốt hơn.

Q2A: Tính grid[i][j] + " " không nối hai chuỗi (vì bên tay trái là int, không phải chuỗi) mà thay vào đó thêm giá trị số vào con trỏ (địa chỉ bộ nhớ của ký tự đầu tiên của chuỗi ""). Sử dụng cout << grid[i][j] << " " để thay thế.

Q2B: Bạn đang chuyển mảng theo giá trị (nó được sao chép) cho readAPuzzle. Hàm này đọc vào bản sao cục bộ của nó, nó sẽ bị hủy khi hàm trả về. Vượt qua bằng cách tham chiếu thay vì (điều này sẽ tránh thực hiện một bản sao và sử dụng bản gốc thay vì):

void readAPuzzle(array2d_t& grid) 
+0

@Tronic, ah tôi thấy. Tôi nghĩ rằng hành vi mặc định cho vectơ sẽ là đi qua tham chiếu, giống như mảng làm. – Salaban

+0

Điều này không giải thích tại sao printGrid đầu tiên() không cung cấp cho tôi một lưới 9x9 của 0 mặc dù?Nếu nó được sao chép, số 0 sẽ vẫn xuất hiện khi in. – Salaban

+0

Mảng là một trường hợp đặc biệt lạ. Tôi sẽ không nói rằng các mảng được chuyển qua tham chiếu, nhưng thay vào đó khi bạn viết [], bạn thực sự có được một con trỏ (sau đó được truyền theo giá trị). Đó là một vấn đề của quan điểm, mặc dù. – Tronic

Các vấn đề liên quan