web-dev-qa-db-ja.com

C ++で2次元配列サイズを見つける方法

C++で2D配列のサイズを見つけるにはどうすればよいですか?配列のサイズを決定するsizeofのような定義済み関数はありますか?

また、設定されていない値を取得しようとしているときに、配列のgetvalueメソッドでエラーを検出する方法を教えてもらえますか?

17
user1322915

配列の使用しか許可されていない場合、次の方法で2次元配列のサイズを見つけることができます。

  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
27
SridharKritha
sizeof(yourObj)/sizeOf(yourObj[0])

トリックを行う必要があります

15
Baz1nga

std::vector

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

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

または、適切なol '配列しか使用できない場合は、sizeofを使用できます。

sizeof( my_array ); /* y size */
sizeof( my_array[0] ); /* x size */
12
#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;
}

出力:6 5

8
enig123

_countof()マクロとともに、ポインター表記を使用して配列サイズを参照できます。配列名自体は行を参照し、配列名によって追加される間接演算子は列を参照します。

#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;
}
2
poorgoat
#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 ;
    }
}
2
Ridowan Ahmed

上記の他の回答は、最初の質問に回答しています。 2番目の質問である、設定されていない値を取得するエラーを検出する方法については、次のどの状況を意味するかわかりません。

  1. 無効なインデックスを使用して配列要素にアクセスする:
    std :: vectorを使用する場合、[]演算子の代わりにvector :: at関数を使用して値を取得できます。インデックスが無効な場合、out_of_range例外がスローされます。

  2. 有効なインデックスにアクセスしていますが、要素はまだ設定されていません:私の知る限り、直接的な方法はありません。ただし、次の一般的な方法で問題を解決できる可能性があります。(1)すべての要素を、確実に保持できない値に初期化します。たとえば、正の整数を扱う場合は、すべての要素を-1に設定して、-1であることがわかったときに値がまだ設定されていないことを確認します。 (2)。同じサイズのブール配列を使用して、同じインデックスの要素が設定されているかどうかを示します。これは、すべての値が「可能」な場合に適用されます。

0
pg30123

int arr [5] [4];

Row subscript(4 raise to 2)の場合、pow)を使用するにはcmathを含めます。

sizeof(arr1)/pow(4,2)   

列の添字:

sizeof(*arr1)/4

4は4バイト、intのサイズを意味します。

0
blank