नीचे प्रत्येक सरणी के लिए स्मृति के एक खंड में सी या सी ++ का उपयोग करके 3 डी सरणी बनाने का एक सीधा तरीका है। बूस्ट (यहां तक कि अगर यह अच्छा है) का उपयोग करने की आवश्यकता नहीं है, या एकाधिक संकेतों के साथ लाइनों के बीच आवंटन को विभाजित करने की आवश्यकता नहीं है (यह काफी खराब है क्योंकि यह डेटा तक पहुंचने पर बड़ी प्रदर्शन जुर्माना देता है और यह स्मृति स्मृति)।
समझने की एकमात्र चीज यह है कि बहुआयामी सरणी जैसी कोई चीज नहीं है, केवल सरणी के सरणी (सरणी के)। सबसे आंतरिक सूचकांक स्मृति में सबसे दूर है।
#include <stdio.h>
#include <stdlib.h>
int main(){
{
// C Style Static 3D Arrays
int a[10][20][30];
a[9][19][29] = 10;
printf("a[9][19][29]=%d\n", a[9][19][29]);
}
{
// C Style dynamic 3D Arrays
int (*a)[20][30];
a = (int (*)[20][30])malloc(10*20*30*sizeof(int));
a[9][19][29] = 10;
printf("a[9][19][29]=%d\n", a[9][19][29]);
free(a);
}
{
// C++ Style dynamic 3D Arrays
int (*a)[20][30];
a = new int[10][20][30];
a[9][19][29] = 10;
printf("a[9][19][29]=%d\n", a[9][19][29]);
delete [] a;
}
}
अपने वास्तविक समस्या के लिए, के रूप में वहाँ संभवतः दो अज्ञात आयाम है, वहाँ मेरे प्रस्ताव के साथ एक समस्या पर यह केवल एक अज्ञात आयाम अनुमति देते हैं। इसे प्रबंधित करने के कई तरीके हैं।
अच्छी खबर यह है कि चर का उपयोग अब सी के साथ काम करता है, इसे परिवर्तनीय लंबाई सरणी कहा जाता है। विवरण के लिए आप here देखें।
int x = 100;
int y = 200;
int z = 30;
{
// C Style Static 3D Arrays
int a[x][y][z];
a[99][199][29] = 10;
printf("a[99][199][29]=%d\n", a[99][199][29]);
}
{
// C Style dynamic 3D Arrays
int (*a)[y][z];
a = (int (*)[y][z])malloc(x*y*z*sizeof(int));
a[99][199][29] = 10;
printf("a[99][199][29]=%d\n", a[99][199][29]);
free(a);
}
तो सी सबसे आसान तरीका का उपयोग कर ++ ऑपरेटर सारणी वाक्य-विन्यास के साथ रहना अधिक भार का उपयोग करने के शायद है:
{
class ThreeDArray {
class InnerTwoDArray {
int * data;
size_t y;
size_t z;
public:
InnerTwoDArray(int * data, size_t y, size_t z)
: data(data), y(y), z(z) {}
public:
int * operator [](size_t y){ return data + y*z; }
};
int * data;
size_t x;
size_t y;
size_t z;
public:
ThreeDArray(size_t x, size_t y, size_t z) : x(x), y(y), z(z) {
data = (int*)malloc(x*y*z*sizeof data);
}
~ThreeDArray(){ free(data); }
InnerTwoDArray operator [](size_t x){
return InnerTwoDArray(data + x*y*z, y, z);
}
};
ThreeDArray a(x, y, z);
a[99][199][29] = 10;
printf("a[99][199][29]=%d\n", a[99][199][29]);
}
ऊपर कोड InnerTwoDArray तक पहुँचने के लिए कुछ अविवेक लागत है (लेकिन एक अच्छा संकलक शायद अनुकूलन कर सकते हैं यह दूर) लेकिन ढेर पर आवंटित सरणी के लिए केवल एक स्मृति खंड का उपयोग करता है। जो आमतौर पर सबसे कुशल विकल्प है।
जाहिर है कि उपरोक्त कोड अभी भी सरल और सीधा है, एसटीएल या बूस्ट इसे अच्छी तरह से करता है, इसलिए पहिया को फिर से शुरू करने की कोई आवश्यकता नहीं है। मुझे अभी भी विश्वास है कि यह जानना दिलचस्प है कि इसे आसानी से किया जा सकता है।
पुरानी हड्डियों को खोदना, मुझे पता है ... लेकिन लोग क्यों सी ++ का उपयोग करते हैं जब बहु-आयामी सरणी जैसी "बुनियादी" चीजें अन्य उच्च स्तरीय भाषाओं के साथ आती हैं? क्या ऐसा कुछ है जिसके लिए आपको सी ++ का उपयोग करना है ताकि आपके हाथ आपकी पीठ के पीछे बंधे हों? प्रदर्शन? – MikeMurko
हाय माइकमुरको, इस समय हाथ से बंधे कारण सबसे सही होंगे। मैं जावा या सी # में ऐसा कुछ करने में भी उतना ही खुश हूं। – AndyUK