Есть ли способ инициализировать все элементы в 2-мерном массиве с введенными размерами без цикла в С ++? - PullRequest
0 голосов
/ 20 июня 2020

Есть ли способ инициализировать все элементы в 2-мерном массиве с введенными с консоли размерами для указанного элемента без цикла в C ++? Например, скажем, у меня есть два целых числа, x и y, и 2d-массив с именем grid:

#include <iostream>

int main() {
    int x, y;
    std::cout << "Enter the dimensions of the array separated by a space: ";
    std::cin >> x >> y;
    bool grid [x][y] {/*all false*/};
    // other code
    return 0;
}

Есть ли способ инициализировать каждый элемент в grid в указанном выше формате? Я пробовал:

    bool grid [x][y] {false};

, но это просто установило для первого элемента значение false.

Ответы [ 5 ]

1 голос
/ 20 июня 2020

Массивы переменной длины не являются стандартной функцией C ++. Более того, даже в C, где массивы допустимой длины включены в Стандарт, вы не можете инициализировать их в объявлении.

В C ++ вы должны использовать стандартный шаблон класса std::vector.

Например,

int x, y;
std::cout << "Enter the dimensions of the array separated by a space: ";
std::cin >> x >> y;
std::vector<std::vector<bool>> grid( x, std::vector<bool>( y ) );

Последний оператор объявляет вектор вектора, все элементы которого будут установлены в false.

0 голосов
/ 23 июня 2020

да, вы можете инициализировать с помощью memset.

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int row=5;
    int col=6;
    int mat[row][col];
    memset(mat, 0, sizeof(mat[0][0]) * row * col);
    
    return 0;
}
0 голосов
/ 20 июня 2020
  • Если вы действительно хотите, чтобы значения были false, вы можете использовать bool grid[x][y] = {};. Это работает, потому что фигурные скобки дают список начальных значений, и когда это будет сделано, все оставшиеся значения в массиве инициализируются нулем, что даст значение false. Примечание: это допустимый C ++, но C не допускает пустой список инициализации, поэтому для простого C вам понадобится bool grid[x][y] = {false};.
  • Как упоминалось выше, вы можете использовать memset. Но, на мой взгляд, это плохой стиль C ++.
  • Вы можете использовать std :: fill или std :: fill_n, потому что двумерный массив представляет собой непрерывный набор значений длиной x * y. Это имеет то преимущество, что вы можете указать другие значения, кроме false.
0 голосов
/ 20 июня 2020

bool grid [x][y], когда x и y не являются constexpr, делает grid VLA (массив переменной длины). VLA: s не существуют в стандартном C ++ и доступны только в качестве расширения в некоторых компиляторах. Я предлагаю вам не использовать их. Боковое примечание: вы обычно хотите поменять местами x и y, так как массивы хранятся в памяти в основном порядке строк, и доступ к элементам, если вы обращаетесь к ним построчно, вероятно, будет быстрее из-за того, как работают кеши.

Идиоматический способ c - использовать std::vector.

#include <iostream>
#include <vector>

int main() {
    size_t x, y; // a suiteable unsigned type

    std::cout << "Enter the dimensions of the array separated by a space: ";
    std::cin >> x >> y;

    // create a 2D vector, all initialized to "false"
    std::vector<std::vector<bool>> grid(y, std::vector<bool>(x, false));  

    for(size_t yval = 0; yval < grid.size(); ++yval) {
        for(size_t xval = 0; xval < grid[yval].size(); ++xval) {
            std::cout << grid[yval][xval];
        }
        std::cout << '\n';
    }  
}
0 голосов
/ 20 июня 2020

Вы можете использовать memset. Вы можете прочитать об этом подробнее здесь

Он устанавливает блок памяти, который вы указываете, на то, что вы передаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...