2012-04-23 63 views
12

Làm cách nào để tìm kích thước của mảng 2D trong C++? Có chức năng được xác định trước nào như sizeof để xác định kích thước của mảng không?cách tìm kích thước mảng 2d trong C++

Ngoài ra, bất kỳ ai cũng có thể cho tôi biết cách phát hiện lỗi trong phương thức getvalue cho mảng trong khi cố gắng lấy giá trị chưa được đặt?

+1

Nếu mảng là ký tự, 'strlen'. Khác, sử dụng vectơ. Họ biết kích thước của chúng, và nó được lấy ra thông qua 'vector :: size()'. Ngay cả với các ký tự, bạn nên sử dụng một chuỗi. Nó có cả 'size()' và 'length()'. – chris

Trả lời

14
sizeof(yourObj)/sizeOf(yourObj[0]) 

nên làm các trick

+0

Chỉ trong một phạm vi mà mảng được khai báo là 'elementType Foo [] []', nếu mảng có mọi phân rã thành một con trỏ thì nó không hoạt động. Mà làm cho nó khó khăn để xác định kích thước tại thời gian chạy. Đó là lý do tại sao các đề xuất sử dụng 'std :: vector' hoặc một số được tạo ra để sắp xếp thứ tự mảng. – dmckee

+0

điều cần biết. đã không làm việc chặt chẽ với C++ – Baz1nga

12

Sử dụng một std::vector.

std::vector< std::vector<int> > my_array; /* 2D Array */ 

my_array.size(); /* size of y */ 
my_array[0].size(); /* size of x */ 

Hoặc, nếu bạn chỉ có thể sử dụng mảng 'ol' tốt, bạn có thể sử dụng sizeof.

sizeof(my_array); /* y size */ 
sizeof(my_array[0]); /* x size */ 
0

Các câu trả lời khác ở trên đã trả lời câu hỏi đầu tiên của bạn. Đối với câu hỏi thứ hai của bạn, làm thế nào để phát hiện một lỗi nhận được một giá trị mà không được thiết lập, tôi không chắc chắn mà các tình huống sau đây bạn có nghĩa là:

  1. Tiếp cận một phần tử mảng sử dụng một chỉ số không hợp lệ:
    Nếu bạn sử dụng std :: vector, bạn có thể sử dụng vector :: tại hàm thay vì toán tử [] để lấy giá trị, nếu chỉ mục không hợp lệ, một ngoại lệ out_of_range sẽ bị ném.

  2. Truy cập chỉ mục hợp lệ, nhưng phần tử chưa được đặt: Theo như tôi biết, không có cách nào trực tiếp. Tuy nhiên, thực tiễn phổ biến sau đây có thể giải quyết được vấn đề của bạn: (1) Khởi tạo tất cả các phần tử thành giá trị mà bạn chắc chắn không thể có. Ví dụ: nếu bạn đang xử lý các số nguyên dương, hãy đặt tất cả các phần tử thành -1, vì vậy bạn biết giá trị chưa được đặt khi bạn tìm thấy giá trị là -1. (2). Chỉ cần sử dụng một mảng bool có cùng kích thước là cho biết liệu phần tử của cùng một chỉ mục có được đặt hay không, điều này áp dụng khi tất cả các giá trị là "có thể".

19

Giả sử bạn chỉ được phép sử dụng mảng sau đó bạn có thể tìm thấy kích thước của mảng 2-d theo cách sau.

int ary[][5] = { {1, 2, 3, 4, 5}, 
        {6, 7, 8, 9, 0} 
       }; 

    int rows = sizeof ary/sizeof ary[0]; // 2 rows 

    int cols = sizeof ary[0]/sizeof(int); // 5 cols 
1
#include<iostream> 
using namespace std ; 
int main() 
{ 
    int A[3][4] = { {1,2,3,4} , {4,5,7,8} , {9,10,11,12} } ; 
    for(int rows=0 ; rows<sizeof(A)/sizeof(*A) ; rows++) 
    { 
     for(int columns=0 ; columns< sizeof(*A)/sizeof(*A[0]) ; columns++) 
     { 
      cout<<A[rows][columns] <<"\t" ; 
     } 
     cout<<endl ; 
    } 
} 
+0

Vui lòng ghi lại cách câu trả lời này đúng. – rfornal

4
#include <bits/stdc++.h> 
using namespace std; 


int main(int argc, char const *argv[]) 
{ 
    int arr[6][5] = { 
     {1,2,3,4,5}, 
     {1,2,3,4,5}, 
     {1,2,3,4,5}, 
     {1,2,3,4,5}, 
     {1,2,3,4,5}, 
     {1,2,3,4,5} 
    }; 
    int rows = sizeof(arr)/sizeof(arr[0]); 
    int cols = sizeof(arr[0])/sizeof(arr[0][0]); 
    cout<<rows<<" "<<cols<<endl; 
    return 0; 
} 

Output: 6 5

0

int arr [5] [4];

Đối subscript hàng (4 tăng đến 2, bao gồm cmath sử dụng pow):

sizeof(arr1)/pow(4,2) 

Cột subscript:

sizeof(*arr1)/4 

4 có nghĩa là 4 byte, kích thước của int.

2

Cùng với macro _countof(), bạn có thể tham khảo kích thước mảng bằng ký hiệu con trỏ, trong đó tên mảng tự đề cập đến hàng, toán tử nối kết được nối thêm vào tên mảng tham chiếu đến cột.

#include <iostream> 
#include <iomanip> 

using namespace std; 

int main() 
{ 
    int beans[3][4]{ 
     { 1, 2, 3, 4 }, 
     { 5, 6, 7, 8 }, 
     { 9, 10, 11, 12 } 
    }; 

    cout << "Row size = " << _countof(beans) // Output row size 
     << "\nColumn size = " << _countof(*beans); // Output column size 
    cout << endl; 

    // Used in a for loop with a pointer. 

    int(*pbeans)[4]{ beans }; 

    for (int i{}; i < _countof(beans); ++i) { 

     cout << endl; 

     for (int j{}; j < _countof(*beans); ++j) { 

      cout << setw(4) << pbeans[i][j]; 
     } 
    }; 

    cout << endl; 
} 
Các vấn đề liên quan