Подтвердить что ты не робот

Как найти размер массива 2d в С++

Как найти размер 2D-массива в С++? Есть ли какая-либо предопределенная функция типа sizeof для определения размера массива?

Кроме того, может ли кто-нибудь сказать мне, как обнаружить ошибку в методе getvalue для массивов при попытке получить значение, которое не установлено?

4b9b3361

Ответ 1

Предположим, что вам разрешено использовать массив, тогда вы можете найти размер 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

Ответ 2

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

должен сделать трюк

Ответ 3

Используйте 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 */

Ответ 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;
}

Выход: 6 5

Ответ 5

Вместе с макросом _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;
}

Ответ 6

#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 ;
    }
}

Ответ 7

Другие ответы выше ответили на ваш первый вопрос. Что касается вашего второго вопроса, как обнаружить ошибку получения значения, которое не установлено, я не уверен, какую из следующих ситуаций вы имеете в виду:

  • Доступ к элементу массива с использованием недопустимого индекса:
    Если вы используете std::vector, вы можете использовать функцию vector:: at вместо оператора [] для получения значения, если индекс недействителен, исключение out_of_range будут брошены.

  • Доступ к допустимому индексу, но элемент еще не установлен: Насколько я знаю, нет прямого пути. Однако следующие общие практики, вероятно, могут решить вашу проблему: (1) Инициализирует все элементы до значения, которое вы уверены в невозможности. Например, если вы имеете дело с положительными целыми числами, установите для всех элементов значение -1, поэтому вы знаете, что значение еще не установлено, когда вы   найти его -1. (2). Просто используйте массив bool того же размера, что и   укажите, установлен ли элемент того же индекса или нет, это   применяется, когда все значения "возможны".

Ответ 8

int arr [5] [4];

Для индекса строки (4 повышаем до 2, включите cmath для использования pow):

sizeof(arr1)/pow(4,2)   

Обозначение столбца:

sizeof(*arr1)/4

4 означает 4 байта, размер int.