ناقلات تغيير حجم المحمولة وسيلة للكشف عن
-
03-07-2019 - |
سؤال
لدي ناقلات أنني التحميل مع معرفة كمية من العناصر (ن).
تجهيز حيوي يخلق العناصر الجديدة التي إلحاق ناقلات.
أنا أتوقع حوالي 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 ، إضافة كل نوع من الشيكات/آثار تحتاج إليها.
(أنا فعلت هذا من قبل ولكن الأمر استغرق مني بعض الوقت لجعل العامل رمز.)