it-swarm.dev

تهيئة ثنائي الأبعاد std :: vector

لذلك ، لدي ما يلي:

std::vector< std::vector <int> > fog;

وأعد تهيئة الأمر بسذاجة للغاية مثل:

    for(int i=0; i<A_NUMBER; i++)
    {
            std::vector <int> fogRow;
            for(int j=0; j<OTHER_NUMBER; j++)
            {
                 fogRow.Push_back( 0 );
            }
            fog.Push_back(fogRow);
    }

إنه شعور خاطئ للغاية ... هل هناك طريقة أخرى لتهيئة ناقل مثل هذا؟

84
Ferenc Deak

استخدم std::vector::vector(count, value) المنشئ الذي يقبل الحجم الأولي والقيمة الافتراضية:

std::vector<std::vector<int> > fog(
    A_NUMBER,
    std::vector<int>(OTHER_NUMBER)); // Defaults to zero initial value

إذا كانت القيمة الأخرى صفراً ، فقل 4 على سبيل المثال ، كان المطلوب هو الافتراضي ، ثم:

std::vector<std::vector<int> > fog(
    A_NUMBER,
    std::vector<int>(OTHER_NUMBER, 4));

يجب أن أذكر أيضًا تهيئة التوحيد الموحد في C++ 11 ، والتي تسمح بتهيئة vector ، والحاويات الأخرى ، باستخدام {}:

std::vector<std::vector<int> > fog { { 1, 1, 1 },
                                    { 2, 2, 2 } };
148
hmjd

لا توجد طريقة append في std::vector ، ولكن إذا كنت تريد إنشاء متجه يحتوي على A_NUMBER متجهات int ، كل منها يحتوي على other_number zeros ، فيمكنك القيام بذلك:

std::vector<std::vector<int>> fog(A_NUMBER, std::vector<int>(OTHER_NUMBER));
29
juanchopanza

لنفترض أنك تريد تهيئة متجه ثنائي الأبعاد ، m * n ، بقيمة مبدئية تساوي 0

يمكننا أن نفعل هذا

#include<iostream>
int main(){ 
    int m = 2, n = 5;

    vector<vector<int>> vec(m, vector<int> (n, 0));

    return 0;
}
13
Jason

بناء الجملة العام ، كما هو موضح بالفعل:

std::vector<std::vector<int> > v (A_NUMBER, std::vector <int> (OTHER_NUMBER, DEFAULT_VALUE))  

هنا ، يمكن تصور المتجه "v" كصفيف ثنائي الأبعاد ، مع "A_NUMBER" من الصفوف ، مع "OTHER_NUMBER" من الأعمدة مع تعيين القيمة الأولية على "DEFAULT_VALUE".

كما يمكن أن يكتب مثل هذا:

std::vector <int> line(OTHER_NUMBER, DEFAULT_VALUE)
std::vector<std::vector<int> > v(A_NUMBER, line)

يشبه إدخال القيم في متجه ثنائي الأبعاد قيم الإدخال في صفيف ثنائي الأبعاد:

for(int i = 0; i < A_NUMBER; i++) {
     for(int j = 0; j < OTHER_NUMBER; j++) {
         std::cin >> v[i][j]
     }
}

تم ذكر أمثلة بالفعل في إجابات أخرى ....!

4
sarthak-sopho