วิธีเริ่มต้นอาร์เรย์ 3 มิติใน C ++

คุณจะเริ่มต้นอาร์เรย์ 3 มิติใน C ++ ได้อย่างไร

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

person Chris_45    schedule 01.02.2010    source แหล่งที่มา


คำตอบ (4)


อาร์เรย์ในคำถามของคุณมีเพียงองค์ประกอบเดียว ดังนั้นคุณจึงต้องการเพียงค่าเดียวเท่านั้นจึงจะเริ่มต้นได้อย่างสมบูรณ์ คุณต้องมีวงเล็บปีกกาสามชุด หนึ่งชุดสำหรับแต่ละมิติของอาร์เรย์

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

ตัวอย่างที่ชัดเจนยิ่งขึ้นอาจเป็น:

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

อย่างที่คุณเห็น มีสองกลุ่ม แต่ละกลุ่มประกอบด้วยสามกลุ่ม กลุ่มละ 4 หมายเลข

person Carl Norum    schedule 01.02.2010
comment
คุณไม่จำเป็นต้อง ต้องการ วงเล็บปีกกาแบบซ้อนสำหรับอาร์เรย์หลายมิติ มาตรฐานกำหนดให้คุณสามารถรันค่าต่างๆ ร่วมกันในรายการแบบแฟลตได้ - person Potatoswatter; 02.02.2010
comment
ตราบใดที่คุณไม่สนใจคำเตือน: warning: missing braces around initializer (near initialization for 'min[0]') - person Carl Norum; 02.02.2010

แทนที่จะใช้อาร์เรย์หลายมิติคงที่ คุณควรใช้อาร์เรย์หนึ่งมิติและคำนวณดัชนีโดยการคูณ เช่น.

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 จัดสรรพื้นที่เก็บข้อมูลแบบไดนามิก ซึ่งเป็นสิ่งที่ดีเนื่องจากพื้นที่สแต็กมักจะมีจำกัดมากและอาร์เรย์ 3 มิติใช้พื้นที่จำนวนมากได้อย่างง่ายดาย การรวมมันไว้ในคลาสแบบนั้นยังทำให้การส่งผ่านอาเรย์ (โดยการคัดลอกหรือโดยการอ้างอิง) ไปยังฟังก์ชันอื่น ๆ เป็นเรื่องเล็กน้อย ในขณะที่การส่งผ่านอาเรย์สแตติกหลายมิตินั้นเป็นปัญหามาก

โค้ดข้างต้นเป็นเพียงตัวอย่างเท่านั้น และสามารถปรับให้เหมาะสมและทำให้สมบูรณ์ยิ่งขึ้นได้ แน่นอนว่ามีการใช้งานสิ่งนี้อยู่ในไลบรารีต่าง ๆ แต่ฉันไม่รู้อะไรเลย

person Tronic    schedule 01.02.2010
comment
สำหรับไลบรารีที่มีอยู่ จะมี Boost.MultiArray และ Boost.uBlas (www.boost.org) อย่างหลังได้รับการปรับแต่งให้เหมาะกับพีชคณิตเชิงเส้นมากกว่า คิดว่า Boost เป็นส่วนขยายของไลบรารี C++ มาตรฐาน (หรือสิ่งที่พวกเขาทิ้งไว้นอกภาษาและไลบรารีมาตรฐาน (TM)) - person Emile Cormier; 01.02.2010
comment
@Emile: ฉันไม่ได้ลงคะแนน แต่ new int[2][3][4] จะทำเคล็ดลับ สำหรับโค้ดของ @Tronic มันแค่ทำซ้ำความพยายามของ std::valarray - person Potatoswatter; 02.02.2010
comment
std::vector นั้นเป็น wrapper RAII ที่ดีสำหรับ new[]/delete[] (และมันยังทำสิ่งอื่น ๆ อีกสองสามอย่าง) ดังนั้นฉันจึงชอบมันมากกว่าการจัดการหน่วยความจำด้วยตนเอง จริงอยู่ ที่นี่จะสิ้นเปลืองสองสามไบต์ในการติดตามขนาดคอนเทนเนอร์ แต่ในทางกลับกัน คุณสามารถใช้มันเพื่อคำนวณขนาดอาร์เรย์ 3 มิติได้ ฉันไม่เห็นว่า std::valarray เกี่ยวข้องกับสิ่งนี้อย่างไร เนื่องจากฉันไม่ได้กำหนดการดำเนินการทางคณิตศาสตร์สำหรับอาร์เรย์และ valarray ไม่รู้ว่าจะปรากฏเป็นอาร์เรย์หลายมิติได้อย่างไร - person Tronic; 02.02.2010
comment
@Potatoswatter: ในความคิดเห็นของฉัน ฉันลืมเพิ่ม ...ด้วยขนาดที่ทราบเฉพาะตอนรันไทม์เท่านั้น เดี๋ยวก่อน นั่นยังไม่สมเหตุสมผลเลย ฉันจะหุบปากเดี๋ยวนี้ :-) - person Emile Cormier; 02.02.2010
comment
@Tronic: คุณสามารถเข้าถึง std::valarray ได้หลายมิติโดยการสมัครสมาชิกด้วย std::gslice ดูลิงค์ที่คำตอบของฉัน คุณหมายถึงอะไร ไม่ได้กำหนดการดำเนินการทางคณิตศาสตร์สำหรับอาร์เรย์? - person Potatoswatter; 02.02.2010
comment
ไวยากรณ์ของอาร์เรย์จะกระชับและชัดเจนยิ่งขึ้น และสะดวกในกรณีหลายมิติขนาดเล็ก - person Phil; 04.08.2016

นี่เป็นอีกวิธีในการจัดสรรอาร์เรย์ 3 มิติแบบไดนามิกใน 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; มีประโยชน์เมื่อประกาศตัวชี้ไปยังอาร์เรย์ 3 มิติที่ยังไม่ได้จัดสรรใน C - person Doug Thompson; 18.10.2019

ดูเหมือนทุกคนจะลืม std::valarray เป็นเทมเพลต STL สำหรับอาร์เรย์หลายมิติแบบแบน และการจัดทำดัชนีและการแบ่งส่วน

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

ไม่มีการเริ่มต้นแบบคงที่ แต่นั่นจำเป็นจริงๆ หรือ?

person Potatoswatter    schedule 02.02.2010
comment
ความคิดเห็น / คำตอบของคุณทำให้ฉันวางคำถามใน std::valarray: stackoverflow.com/questions/2187648/ ได้อย่างไร - person Emile Cormier; 03.02.2010