/ / मनमानी सीमा वाले वर्ग सदस्य के रूप में बहुआयामी सरणियाँ - c ++, सरणियाँ, बहुआयामी-सरणी, वाक्यविन्यास, तात्कालिकता

कक्षा के सदस्य के रूप में बहुआयामी सरणी मनमानी सीमाओं के साथ - सी ++, सरणी, बहुआयामी-सरणी, वाक्यविन्यास, तत्काल

का डुप्लिकेट नहीं सी ++: कंस्ट्रक्टर में बहुआयामी सरणी आरंभीकरण सभी जवाब के बाद से दिखाई मानने के लिए संकलित समय पर सीमाएं ज्ञात हैं।

मैं एक भारित अप्रत्यक्ष ग्राफ वर्ग बना रहा हूं arraygraph, 2 डी सरणी द्वारा समर्थित है int, के नाम से edges[][]। तात्कालिकता के समय मैं वास्तव में परवाह नहीं करता edges[][] रखती है; arraygraph एक विधि है जो किसी दिए गए फ़ाइल नाम से एक ग्राफ पढ़ता है और edges में सेट है new int[n][n] (कहा पे n इससे पहले कि यह पॉप्युलेट करता है उस फ़ंक्शन द्वारा # फ़ाइल में # नोड है।

परेशानी यह है, जी ++ doesn "टी के लिए जिस तरह से मैं परिभाषित" की तरह लग रहे हो edges[][]। यह सरणी के लिए सीमा निर्धारित करना चाहता है, और संकलन समय पर मैं डॉन "टी नहीं करता हूं जानना सीमा। क्या मुझे बस फिर से परिभाषित करना चाहिए edges एक के रूप में int *? या के रूप में edges[][0]? या कुछ और पूरी तरह से?

मैं किसी भी तरह से एक सी ++ विशेषज्ञ नहीं हूं (मैं एक अजगर थोथा आदमी हूं) इतने जटिल, भारी विकल्प वर्ग-सदस्य के रूप में अपरिभाषित आकार के साथ सरणी गुंजाइश से बाहर थोड़े हैं (निश्चित रूप से वहाँ की तुलना में एक सरल तरीका है उस...)। अगर मैं क्या करने की कोशिश कर रहा हूं तो यह पूरी तरह से एक गलत बात है कि यह भी एक उपयोगी बात है, और यह जानना आसान है कि मुझे क्या करना चाहिए।

उत्तर:

उत्तर № 1 के लिए 1

C ++ को परिवर्तनशील लंबाई सरणियों का पता नहीं है। इसलिए आपको अपने सरणी को एक स्थिर आकार के साथ परिभाषित करने की आवश्यकता है। यह किसी सरणी को फिर से परिभाषित करने के लिए संभव नहीं है।

आपके बहुआयामी सरणी के लिए दो विकल्प:

  • सरणियों के गतिशील सरणी, के रूप में लागू किया गया int **edges
  • std :: aka के बजाय सदिश vector<vector<int>> edges;

यदि आप अपने डेटा (एक स्टेटमेंट में किया गया है) की प्रतिलिपि बनाने या आकार बदलने की आवश्यकता हो तो वैक्टर बेहद उपयोगी हैं। तो मैं दूसरा विकल्प सुझाता हूं:

int N=10; // dynamic!
vector<vector<int>> m(N, vector<int>(N));

सूचक का उपयोग करने के लिए परिवर्तनकारी होगा:

int N=10; // dynamic!
int**m = new int*[N];    // allocate the first array
for (int i = 0; i < N; i++) {  // allocate the second arrays
m[i] = new int[N]{};
}

दोनों ही स्थिति में, आप डेटा को एक ही सिंटैक्स के साथ एक्सेस करते हैं:

for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++)
cout << m[i][j] << "t";
cout << endl;
}

जवाब के लिए 0 № 2

ऐसा लगता है कि आप गतिशील आकार सरणी के लिए देख रहे हैं। प्रयोग करके देखें std::vector सरणी के बजाय।