كيفية الحصول على كفيكتور<T> من كفيكتور<QVector<T>>?

StackOverflow https://stackoverflow.com/questions/9462011

  •  13-11-2019
  •  | 
  •  

سؤال

لقد حصلت على كفيكتور من كفيكتور.وأريد أن جمع كل العناصر في جميع كفيكتورس لتشكيل كفيكتور جديد.

حاليا يمكنني استخدام رمز مثل هذا

QVector<QVector<T> > vectors;
// ...
QVector<T> collected;
for (int i = 0; i < vectors.size(); ++i) {
     collected += vectors[i];
}

ولكن يبدو أن operator+= هو في الواقع إلحاق كل عنصر إلى QVector.فهل هناك استخدام أكثر فعالية من الوقت QVector أو نوع مناسب أفضل استبدال QVector?

هل كانت مفيدة؟

المحلول

إذا كنت حقا تحتاج إلى ، ثم أود أن تفعل شيئا من هذا القبيل:

QVector< QVector<T> > vectors = QVector< QVector<T> >();

int totalSize = 0;
for (int i = 0; i < vectors.size(); ++i)
    totalSize += vectors.at(i).size();

QVector<T> collected;
collected.reserve(totalSize);

for (int i = 0; i < vectors.size(); ++i)
    collected << vectors[i];

ولكن يرجى ملاحظة أن هذا يبدو قليلا مثل التحسين المبكر.كما الوثائق يشير إلى:

يحاول كفيكتور تقليل عدد عمليات إعادة التخصيص عن طريق تخصيص ما يصل إلى ضعف الذاكرة التي تحتاجها البيانات الفعلية.

لذلك لا تفعل هذا النوع من الأشياء إلا إذا كنت متأكدا حقا من أنه سيحسن أدائك.يبقيه بسيط (مثل الطريقة الحالية للقيام بذلك).

تحرير استجابة لمتطلبات إضافية من س (1): حسنا إذا كنت إدراج عشوائيا انها قائمة مرتبطة ولكن إذا كنت مجرد إلحاق(كما أن كل ما ذكرته) كنت قد حصلت بالفعل على إطفاء س (1) مع كفيكتور.الق نظرة على وثائق حاويات كيو تي.

نصائح أخرى

for (int i = 0; i < vectors.size(); ++i) {
    for(int k=0;k<vectors[i].size();k++){
        collected.push_back(vectors[i][k]);
    }
}

الحلقة الخارجية:أخرج كل متجه من المتجهات
الحلقة الداخلية:أخرج كل عنصر في المتجه الأول وادفعه إلى المجموعة

يمكنك استخدام تعزيز متعدد الصفيف, ، يوفر هذا مصفوفة متعددة الأبعاد.

بل هو أيضا مكتبة' رأس فقط ' ، لذلك لا تحتاج إلى تجميع مكتبة بشكل منفصل ، مجرد إسقاط الرؤوس في مجلد في المشروع الخاص بك وتضمينها.

انظر الرابط الخاص بالبرنامج التعليمي والمثال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top