سؤال

لدي ناقلات أنني التحميل مع معرفة كمية من العناصر (ن).

تجهيز حيوي يخلق العناصر الجديدة التي إلحاق ناقلات.

أنا أتوقع حوالي 2 * N العناصر الإضافية المزمع إنشاؤها ، لذا حجم ناقلات 3 * N.

إذا كان عناصر إضافية تتجاوز ذلك ، أود برنامج إحباط بدلا من التوسع الديناميكي ناقلات.

هل هناك طريقة للكشف عن هذا هو المحمولة بين AIX/TRU64/لينكس ؟

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

المحلول

الكشف عن ماذا ؟ سواء ناقلات سوف يكون حجمها?ما إذا كان قد تم ؟

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

هـ.ز

template<class T> 
void add_element(std::vector<T>& container, T const& v)
{
  if (container.capacity()+1 >= 3*N)
  {
    // terminate/exception/whatever
  }

 container.push_back(v);
}

نصائح أخرى

لماذا تستخدم ناقل?المغزى من ناقل حيوي التوسع عند الحاجة.

بدلا من جعل فئة إلى مندوب ناقلات, جعل مجرد فئة مندوب بسيط الصفيف.لديك push_back التحقق من حجم و إحباط عند الحاجة.

إنشاء الخاصة بك الطبقة التي من شأنها تخويل ناقلات.والتحقق من حجم الخاصة بك في push_back.

إذا كنت تعرف حجم في وقت الترجمة ، ربما باستخدام std::tr1::مجموعة (أو دفعة::مجموعة) سيكون خيارا أفضل.يبقى حجم ثابت و التحقق من وصول مثل std::المتجهات.

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

في هذا النهج الأخير ، أود أن أقترح إذا كنت يمكن أن نعرف الحجم الأقصى في ناقلات الخلق ، الاحتياطي ( std::vector::الاحتياطي() ) أقصى حجم ناقلات في تغليف منشئ فئة (أو وظيفة التهيئة).بهذه الطريقة, لن يكون هناك المزيد من الذاكرة التلاعب من قبل ناقلات نفسه (إلا إذا كان عناصر مكافحة ناقلات منشئ/المدمر تفعل مثل هذه التلاعبات).ثم إضافة بسيطة التأكيد على أن الشيكات التي ناقلات سعة ( std::vector::قدرة() ) لم يتغير في بداية ونهاية كل وظائف الفئة الخاصة بك سوف تساعدك على التأكد من الذاكرة انها لا تتحرك.

على سبيل المثال (على افتراض DATA_MAX_SIZE افتراضي ماكس حجم محدد في مكان ما) :

template< typename MyType >
class MyData
{
public:
    MyData( unsigned long max_size = DATA_MAX_SIZE )
        : m_max_size( max_size )
        { m_data.reserve( m_max_size ); }

    void add( const MyType& value ) { check_capacity(); m_data.push_back( value ); check_capacity(); }



private:

    std::vector< MyType > m_data;
    const unsigned long m_max_size;

    void check_capacity() { if( m_data.capacity() != m_max_size ) throw Exception("Useful error message here!" ); }

};

أو شيء من هذا القبيل...

الأمراض المنقولة جنسيا دروس استخدام مخصص يسمى في كل مرة تقوم بإدراج عنصر.يمكنك كتابة جديد مخصص وراثة من الأمراض المنقولة جنسيا::alocator ، إضافة كل نوع من الشيكات/آثار تحتاج إليها.

(أنا فعلت هذا من قبل ولكن الأمر استغرق مني بعض الوقت لجعل العامل رمز.)

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