Cara menginisialisasi array 3D di C++

Bagaimana Anda menginisialisasi array 3d di C++

int min[1][1][1] = {100, { 100, {100}}}; //this is not the way

person Chris_45    schedule 01.02.2010    source sumber


Jawaban (4)


Array dalam pertanyaan Anda hanya memiliki satu elemen, jadi Anda hanya memerlukan satu nilai untuk menginisialisasinya sepenuhnya. Anda memerlukan tiga set kurung kurawal, satu untuk setiap dimensi array.

int min[1][1][1] = {{{100}}};

Contoh yang lebih jelas mungkin:

int arr[2][3][4] = { { {1, 2, 3, 4}, {1, 2, 3, 4}, {1, 2, 3, 4} },
                     { {1, 2, 3, 4}, {1, 2, 3, 4}, {1, 2, 3, 4} } };

Seperti yang Anda lihat, ada dua grup, masing-masing berisi tiga grup yang terdiri dari 4 angka.

person Carl Norum    schedule 01.02.2010
comment
Anda tidak membutuhkan kurung kurawal bertingkat untuk array multidimensi. Standar ini mengharuskan Anda menjalankan nilai-nilai bersama-sama dalam daftar datar. - person Potatoswatter; 02.02.2010
comment
Selama Anda tidak peduli dengan peringatan: warning: missing braces around initializer (near initialization for 'min[0]') - person Carl Norum; 02.02.2010

Daripada menggunakan array multidimensi statis, Anda mungkin harus menggunakan array satu dimensi dan menghitung indeks dengan perkalian. Misalnya.

class Array3D {
    size_t m_width, m_height;
    std::vector<int> m_data;
  public:
    Array3D(size_t x, size_t y, size_t z, int init = 0):
      m_width(x), m_height(y), m_data(x*y*z, init)
    {}
    int& operator()(size_t x, size_t y, size_t z) {
        return m_data.at(x + y * m_width + z * m_width * m_height);
    }
};

// Usage:
Array3D arr(10, 15, 20, 100); // 10x15x20 array initialized with value 100
arr(8, 12, 17) = 3;

std::vector mengalokasikan penyimpanan secara dinamis, yang merupakan hal yang baik karena ruang tumpukan seringkali sangat terbatas dan array 3D dengan mudah menggunakan banyak ruang. Membungkusnya dalam kelas seperti itu juga membuat penerusan array (dengan menyalin atau dengan referensi) ke fungsi lain menjadi sepele, sementara melakukan penerusan array statis multidimensi sangat bermasalah.

Kode di atas hanyalah sebuah contoh dan dapat dioptimalkan serta dibuat lebih lengkap. Implementasi ini juga sudah ada di berbagai perpustakaan, tapi saya tidak tahu ada.

person Tronic    schedule 01.02.2010
comment
Untuk perpustakaan yang sudah ada ada Boost.MultiArray dan Boost.uBlas (www.boost.org). Yang terakhir ini lebih disesuaikan dengan aljabar linier. Bayangkan Boost sebagai perpanjangan dari pustaka C++ standar (atau Hal-Hal yang Mereka Tinggalkan dari Bahasa dan Perpustakaan Standar(TM)). - person Emile Cormier; 01.02.2010
comment
@Emile: Saya tidak memberi suara negatif, tetapi new int[2][3][4] akan berhasil. Adapun kode @Tronic, hanya menduplikasi upaya std::valarray. - person Potatoswatter; 02.02.2010
comment
std::vector pada dasarnya adalah pembungkus RAII yang bagus untuk new[]/delete[] (dan juga melakukan beberapa hal lainnya) jadi saya selalu lebih memilihnya daripada mengelola memori secara manual. Memang benar, ini membuang beberapa byte untuk melacak ukuran wadah, namun di sisi lain Anda dapat menggunakannya untuk menghitung dimensi array 3D. Saya tidak mengerti apa hubungannya std::valarray dengan ini, karena saya belum mendefinisikan operasi aritmatika apa pun untuk array dan valarray tidak tahu cara tampil sebagai array multidimensi. - person Tronic; 02.02.2010
comment
@Potatoswatter: Dalam komentar saya, saya lupa menambahkan ...dengan dimensi yang hanya diketahui saat runtime. Tunggu, itu masih tidak masuk akal. Aku akan diam saja sekarang. :-) - person Emile Cormier; 02.02.2010
comment
@Tronic: Anda mendapatkan akses multidimensi ke std::valarray dengan berlangganan dengan std::gslice. Lihat tautan di jawaban saya. Apa maksud Anda, belum mendefinisikan operasi aritmatika apa pun untuk array? - person Potatoswatter; 02.02.2010
comment
Sintaks array lebih ringkas, jelas. dan nyaman dalam kasus multidimensi yang lebih kecil. - person Phil; 04.08.2016

Berikut cara lain untuk mengalokasikan array 3D secara dinamis di C++.

int dimX = 100; int dimY = 100; int dimZ = 100;
int*** array;    // 3D array definition;
// begin memory allocation
array = new int**[dimX];
for(int x = 0; x < dimX; ++x) {
    array[x] = new int*[dimY];
    for(int y = 0; y < dimY; ++y) {
        array[x][y] = new int[dimZ];
        for(int z = 0; z < dimZ; ++z) { // initialize the values to whatever you want the default to be
            array[x][y][z] = 0;
        }
    }
}
person Kenny Cason    schedule 19.10.2010
comment
int*** array; berguna saat mendeklarasikan pointer ke array 3D yang belum dialokasikan di C. - person Doug Thompson; 18.10.2019

Semua orang sepertinya lupa std::valarray. Ini adalah templat STL untuk array multidimensi datar, dan mengindeks serta memotongnya.

http://www.cplusplus.com/reference/std/valarray/

Tidak ada inisialisasi statis, tetapi apakah itu penting?

person Potatoswatter    schedule 02.02.2010
comment
Komentar/jawaban Anda membuat saya mengajukan pertanyaan di std::valarray: stackoverflow.com/questions/2187648/ - person Emile Cormier; 03.02.2010