คุณจะเริ่มต้นอาร์เรย์ 3 มิติใน C ++ ได้อย่างไร
int min[1][1][1] = {100, { 100, {100}}}; //this is not the way
คุณจะเริ่มต้นอาร์เรย์ 3 มิติใน C ++ ได้อย่างไร
int min[1][1][1] = {100, { 100, {100}}}; //this is not the way
อาร์เรย์ในคำถามของคุณมีเพียงองค์ประกอบเดียว ดังนั้นคุณจึงต้องการเพียงค่าเดียวเท่านั้นจึงจะเริ่มต้นได้อย่างสมบูรณ์ คุณต้องมีวงเล็บปีกกาสามชุด หนึ่งชุดสำหรับแต่ละมิติของอาร์เรย์
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 หมายเลข
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 มิติใช้พื้นที่จำนวนมากได้อย่างง่ายดาย การรวมมันไว้ในคลาสแบบนั้นยังทำให้การส่งผ่านอาเรย์ (โดยการคัดลอกหรือโดยการอ้างอิง) ไปยังฟังก์ชันอื่น ๆ เป็นเรื่องเล็กน้อย ในขณะที่การส่งผ่านอาเรย์สแตติกหลายมิตินั้นเป็นปัญหามาก
โค้ดข้างต้นเป็นเพียงตัวอย่างเท่านั้น และสามารถปรับให้เหมาะสมและทำให้สมบูรณ์ยิ่งขึ้นได้ แน่นอนว่ามีการใช้งานสิ่งนี้อยู่ในไลบรารีต่าง ๆ แต่ฉันไม่รู้อะไรเลย
new int[2][3][4]
จะทำเคล็ดลับ สำหรับโค้ดของ @Tronic มันแค่ทำซ้ำความพยายามของ std::valarray
- person Potatoswatter; 02.02.2010
std::valarray
ได้หลายมิติโดยการสมัครสมาชิกด้วย std::gslice
ดูลิงค์ที่คำตอบของฉัน คุณหมายถึงอะไร ไม่ได้กำหนดการดำเนินการทางคณิตศาสตร์สำหรับอาร์เรย์?
- person Potatoswatter; 02.02.2010
นี่เป็นอีกวิธีในการจัดสรรอาร์เรย์ 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;
}
}
}
int*** array;
มีประโยชน์เมื่อประกาศตัวชี้ไปยังอาร์เรย์ 3 มิติที่ยังไม่ได้จัดสรรใน C
- person Doug Thompson; 18.10.2019
ดูเหมือนทุกคนจะลืม std::valarray
เป็นเทมเพลต STL สำหรับอาร์เรย์หลายมิติแบบแบน และการจัดทำดัชนีและการแบ่งส่วน
http://www.cplusplus.com/reference/std/valarray/
ไม่มีการเริ่มต้นแบบคงที่ แต่นั่นจำเป็นจริงๆ หรือ?