تهيئة صفيف ثنائي الأبعاد مع عدد ديناميكي من الصفوف وعدد الأعمدة الثابتة. C ++
-
27-09-2019 - |
سؤال
أواجه مشكلة في إنشاء صفيف ديناميكي ثنائي الأبعاد في C ++. أريد أن يكون لها رقم ديناميكي (مثل NUMR) من "الصفوف" والرقم الثابت (على سبيل المثال 2) من "الأعمدة".
حاولت فعل ذلك مثل هذا:
const numC = 2;
int numR;
numR = 10;
double *myArray[numC];
myArray = new double[numR];
لسوء الحظ ، لا يعمل. هل من الممكن القيام بذلك بهذه الطريقة؟
بالطبع يمكنني استخدام double **myArray
وتهيئته كما لو كان كل من الأبعاد ديناميكيًا (مع استخدام NUMC كمحدد في الحلقة) ولكن أود تجنبها إن أمكن.
شكرا مقدما.
المحلول
هل من الممكن القيام بذلك بهذه الطريقة؟
نعم:
double (*myArray)[numC] = new double[numR][numC];
// ...
delete[] myArray;
قد يبدو هذا غير عادي بعض الشيء ، لكن 5.3.4 §5 ينص بوضوح على:
نوع من
new int[i][10]
هوint (*)[10]
لاحظ أن العديد من المبرمجين ليسوا على دراية ببناء CderAtor Centax ولن يفهموا هذا الرمز. أيضا ، التخصيص الديناميكي اليدوي ليس استثناء آمن. بالنسبة لهذه Reeons ، يكون متجه المصفوفات أفضل:
#include <vector>
#include <array>
std::vector<std::array<double, numC> > vec(numR);
// ...
// no manual cleanup necessary
يحل محل std::array
مع std::tr1::array
أو boost::array
, ، اعتمادا على المترجم الخاص بك.
نصائح أخرى
لماذا لا تستخدم أ STD :: ناقلات, ، والاستفادة من البناء:
std::vector<std::vector<int> > my2Darray(2, std::vector<int>(10));
my2Darray[0][0] = 2;
يجب أن تكون هناك حلقة لأنك تحتاج إلى إنشاء صفيف لكل عمود.
أعتقد أن ما تتبعه هو:
double *myArray[numC];
for (int i = 0; i < numC; i++) {
myArray[i] = new double[numR];
}
// some code...
// Cleanup:
for (int i = 0; i < numC; i++) {
delete [] myArray[i];
}
هذا يعلن مجموعة من المؤشرات (إلى double
) مع numC
عناصر ، ثم يخلق مجموعة من double
S مع numR
عناصر لكل عمود في myArray
. لا تنس أن تطلق الذاكرة عند الانتهاء من ذلك أو سيكون لديك تسرب ذاكرة.
يجب أن تكون فهارسك صفًا ، ثم العمود.
double** myArray = new double*[numR];
for( unsigned int i = 0; i < numR; i++ ) {
myArray[i] = new double[numC];
}
الوصول إلى الصف 2 ، العمود 5:
myArray[2][5];