मान लें कि आपके पास आयाम x प्रति y (प्रति z) की एक मैट्रिक्स है जैसे परिभाषित:
int** tab = new int*[x];
for(int i=0; i<x; ++i) tab[i] = new int[y];
या
int*** tab = new int**[x];
for(int i=0; i<x; ++i) {
tab[i] = new int*[y];
for(int j=0; j<y; ++y) tab[i][j] = new int[z];
}
उप-मैट्रिक्स तक पहुंचने का कोई स्मार्ट तरीका है (प्राप्त करें int**(*)
डेटा प्रतिलिपि के बिना, सादा सी ++) जिसमें शीर्ष-बाएं (-फ्रंट) कोने [ए, बी (, सी)] और आकार [ए, बी (, सी)] होगा?
समस्या के ग्राफिकल उदाहरण यहां (बेहतर या बदतर) हैं।
उत्तर:
जवाब के लिए 2 № 1आप एक जंजीर सरणी कहा जाता है का उपयोग कर रहे हैं। यह सरणी की एक सरणी है, जहां रनटाइम के अलावा कुछ भी लागू नहीं करता है कि उप सरणी एक ही आकार के हैं। इसलिए जंजीर, क्योंकि आप आकार में भिन्न हो सकते हैं।
एक submatrix है कि एक भी हैजंजीर सरणी, आपको submatrix के उपनगरों पर इशारा करते हुए पॉइंटर्स की एक जंजीर सरणी मौजूद होने की आवश्यकता है। ये सामान्य रूप से अस्तित्व में नहीं हैं, इसलिए नहीं, आप कम से कम कुछ एरेज़ पॉइंटर्स को उपरोक्त करने के लिए "प्रतिलिपि किए बिना" नहीं कर सकते हैं।
अगर आपका मैट्रिक्स जेगेड सरणी आधारित नहीं था, लेकिन इसके बजाय एकल सरणी थी प्रगति, तो उप-उपरोक्त संकेतों को आवंटित किए बिना उपनिवेशों के विचार बनाए जा सकते हैं। इसके अलावा यह अधिक कैश अनुकूल होगा।
गैर-जाग्रत मैट्रिक्स लिखने के लिए, एक आयाम दृश्य या स्पैन क्लास लिखकर प्रारंभ करें जो एक आयाम को संभालता है।
दो आयामों के लिए, आप आयाम आकार या ट्राइड के टुपल को स्टोर करने के लिए अवधि वर्ग को बढ़ाते हैं। []
गणना किए गए तत्व के संदर्भ को वापस करने के बजाय, एक आयाम-निचला अवधि उदाहरण बनाता है जो गणना की स्थिति पर इंगित करता है, जब तक आयाम 0 केस जहां आप कोई संदर्भ नहीं देते।
यह अत्यधिक कुशल, परमिट कुशल उपरोक्त होगा, लेकिन सही होने के लिए कोड के कुछ दर्जन या 100 लाइनों की आवश्यकता होती है।