سؤال

for (int i = 0 ; i < stlVector.size() ; i++)
{ 
    if (i == 10)
    { 
        stlVector.erase(stlVector.begin() + 5 )
    }
}

هل جزء إنهاء جزء "Stlvector.size ()" Stlvector.erase (...) "في الاعتبار؟ في Word آخر لا STLVETOR.SIZE () تحديث لكل تكرار حلقة؟ لا أستطيع اختباره الآن، لذلك نشرت سؤالا هنا.

تشك مقدما!

مع أطيب التحيات،

Zhengtonic

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

المحلول

فقط لتكون واضحة، لا تفكر في ذلك من حيث الحلقة المنعشة أي شيء. في كل مرة يتم فيها تحديد الحالة (في بداية كل مرة من خلال الحلقة)، يتم استدعاء الطريقة () الحجم () على متغير STLVector، يتم إرجاع الحجم الحالي للمتجه.

يتم تقليل طريقة ERASE () حجم المتجه، لذلك يتم استدعاء حجم المرة القادمة ()، ستكون القيمة المرتجعة أصغر.

نصائح أخرى

نعم إنها كذلك!

stlVector.size () // is called for evey iteration

وبالتالي بالنسبة لكل حلقة، سيكون لديك اختبار "أنا <stlvector.size ()" إعادة تقييم!

نعم، يتم إجراء الاختبار، مع آثار جانبية، لكل حلقة.

بالنسبة للحلقة هي مجرد اتفاقية لطيفة - من أجل حلقة حلقة بسهولة كحلقة من حين

for (int i = 0 ; i < stlVector.size() ; i++)
{ 
    if (i == 10)
    { 
        stlVector.erase(stlVector.begin() + 5 )
    }
}

يصبح:

int i = 0 ;

while(i < stlVector.size())
{ 
    if (i == 10)
    { 
        stlVector.erase(stlVector.begin() + 5 )
    }
    i++;
}

-Adam.

نعم، لا تفعل ذلك، ولكن لا تفعل هذا! إذا كنت ترغب في إزالة العناصر من متجه، فقم بذلك داخل حلقة أخرى. أنت تحذف عناصر بعد فهرس I في هذه الحالة: لا شيء يضمن أن عنصر STLVector [i + 5] موجود. إذا قمت بإزالة عنصر I-TH من المتجه، يتم كسر عدد الخاص بك لأنه يمكنك القفز عناصر دون التحقق منها.

الطريقة الأكثر آمنة للقيام بذلك تقوم بتخزين المراجع عن العناصر الموجودة على STLVector التي تريد حذفها على متجه آخر، ثم تكرر في هذا المتجه Auxiliar الذي يقوم به Stlvector.erase (Auxvector [i]).

أتوقع الكود الذي قدمته هو مجرد "رمز الخيال" (كمعلق واحد وضعه) لإعطاء مثال ملموس لنوع الشيء الذي تحاول القيام به.

ومع ذلك فقط في حالة عدم: الحلقة التي قدمتها سوف تخطي العنصر الثاني عشر (أي العنصر في الأصل في stlVector[11]) لأنه عند الفحص stlVector[10] يمكنك حذف عنصر سابق، مما تسبب في تحويل جميع العناصر اللاحقة إلى الأمام بمكانة واحدة، لكنك لا تزال تزداد i في نهاية الحلقة. لذلك سوف ينظر التكرار التالي stlVector[11] وهو في الواقع العنصر الذي كان في الأصل في stlVector[12]. وبعد لعلاج هذا، تحتاج إلى --i بعد الدعوة إلى erase().

دائما إعادة تقييم

أيضا، لتوضيح بعض الشيء، نظرا لأنك سئلت عما إذا كان قد تم ذلك بهذه الطريقة "في VC ++ 6".

يتم إعادة تقييم "الحالة المتابعة" في كل حلقة في كل إصدار من C، C ++، C # و Java.

إذا لم يولد أي يكافح رمز يفعل ذلك، فقد مكسور يجب قد تم تحاشيه.

كما قال آخرون، نعم يتم إعادة تقييم الحالة في كل مرة من خلال الحلقة. لهذا السبب تحسين الأداء المشترك هو:

int saveSize = someExpensiveComputation();

for (int i = 0 ; i < saveSize ; i++)
{ 
    foo(i);
}

حيث الحلقة المشروطة مكلفة على الإطلاق للحساب، بدلا من

for (int i = 0 ; i < someExpensiveComputation(); i++)
{ 
    foo(i);
}

حيث تم إجراء حساب باهظة الثمن بلا داع لكل تكرار من خلال الحلقة.

نعم انها تقلل من الحجم. مزيد من المعلومات هنا

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