أين يمكنني أن أجد كل ضمانات الاستثناء للحاويات والخوارزميات القياسية؟

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

سؤال

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

ملاحظة: أنا ليس طلب قائمة بجميع الضمانات يمكن أن يفكر الناس، وهو أساسا في

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

المحلول

قراءة المعيار قد يكون مخيفا (دعنا نعود إلى المعيار)، لكن Bjarne Stroustrup كتب ملحق لطيف حقا حول هذا الموضوع في كتابه "لغة البرمجة C ++". قام بنشر هذا الملحق في

p> http://www.stroustrup.com/3rd_safe0.html ، في http://www.stroustrup.com/3rd_safe.pdf

أنها طويلة جدا ومفصلة (ومكتوبة جيدا). قد تجد على سبيل المثال القسم E.4 مثيرة للاهتمام، Quote:

e.4 ضمانات الحاوية القياسية

إذا كانت عملية مكتبة نفسها ترمي استثناء، فيمكنه - تأكد من ترك الكائنات التي تعمل عليها في حالة محددة جيدا. على سبيل المثال، في () رمي out_of_range ل ناقل (§ 16.3.3) ليست مشكلة في مجال السلامة الاستثناء للمتجه وبعد لا يمثل الكاتب في () مشكلة في التأكد من أن ناقل في حالة محددة جيدا قبل رمي.

بالإضافة إلى ذلك، القسم E.4.1 الولايات

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

ألق نظرة على الصفحة 956. تحتوي على جدول ضمانات لمختلف العمليات للمتجه، Deque، القائمة والخريطة. باختصار، جميع العمليات على تلك الحاويات هي إما غير موجودة أو قوية، باستثناء N - إدراج عنصر في الخريطة والتي تقدم الضمانات الأساسية.

ملاحظة: النص أعلاه قديم ولا يتناول C ++ 11، ولكن يجب أن يكون صحيحا بما فيه الكفاية لمعظم الأهداف والأغراض.

عندما يتعلق الأمر C ++ 11 ...

الدول الأولى القياسية، حول الحاويات array, deque, forward_list, list, vector, map, set, unordered_map, unordered_set, queue,stack: في

23.2.1 / 10 :

ما لم ينص على خلاف ذلك (انظر 23.2.4.1، 23.2.5.1، 23.3.3.4، و 23.3.6.5) تفي جميع أنواع الحاويات المعرفة في هذه البند بالمتطلبات الإضافية التالية:

- إذا تم إلقاء استثناء بواسطة وظيفة إدراج () أو emplace () أثناء إدراج عنصر واحد، هذه الوظيفة ليس لها أي تأثيرات.
- إذا تم إلقاء استثناء بواسطة وظيفة push_back () أو push_front ()، هذه الوظيفة ليس لها أي تأثيرات.
- لا محو ()، واضح ()، pop_back () أو pop_front () الوظيفة يلقي استثناء.
- لا نسخ منشئ أو عامل تعيين للمكرر الذي تم إرجاعه يلقي استثناء.
- لا توجد وظيفة مبادلة ترمي استثناء.
- لا توجد وظيفة مبادلة () تبطل أي مراجع أو مؤشرات أو المحامون الذين يشيرون إلى عناصر الحاويات التي تم تبديلها.

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

نصائح أخرى

n3376

23.2.1 متطلبات الحاويات العامة [حاوية.إرادة .العام]

الفقرة 10

ما لم ينص على خلاف ذلك (انظر 23.2.4.1، 23.2.5.1، 23.3.3.4، و 23.3.6.5) تفي جميع أنواع الحاويات المحددة في هذه البند بالمتطلبات الإضافية التالية:
- إذا تم إلقاء استثناء بواسطة دالة إدراج () أو emplace () أثناء إدراج عنصر واحد، فإن هذه الوظيفة لا تحتوي على أي تأثيرات.
- إذا تم إلقاء استثناء بواسطة وظيفة Push_back () أو Push_front ()، فإن هذه الوظيفة لا تحتوي على أي تأثيرات.
- لا محو ()، واضح ()، pop_back () أو pop_front () وظيفة يلقي استثناء.
- لا يوجد نسخ منشئ أو عامل تعيين للمكرر الذي تم إرجاعه يرمي استثناء.
- لا توجد وظيفة مبادلة ترمي استثناء.
- لا توجد وظيفة مبادلة () تبطل أي مراجع أو مؤشرات أو محامون يشيرون إلى عناصر الحاويات التي يتم تبديلها.
[ملاحظة: لا يشير المحفز في النهاية () إلى أي عنصر، لذلك قد يتم إبطاله. - entnote]

(H2> 23.2.4 حاويات مشتركة [Associative.Reqmts]

23.2.4.1 ضمانات سلامة الاستثناء [Associative.Reqmts.except]

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

23.2.5 حاويات مشتركة غير مرتبة [unord.req]

23.2.5.1 ضمانات سلامة الاستثناء [unord.Req.except]

1 للحاويات البريدية غير المدرجة، لا توجد وظيفة واضحة () استثناء. لا يتم إلقاء محو (ك) استثناء ما لم يتم إلقاء هذا الاستثناء بواسطة هش الحاوية أو الكائن المسجل (إن وجد).
2 للحصول على حاويات مشتركة غير مرتبة، إذا تم إلقاء استثناء بأي عملية بخلاف وظيفة تجزئة الحاوية من داخل وظيفة إدراج أو إمكانية إدراج عنصر واحد، فإن الإدراج ليس له أي تأثير.
3 بالنسبة للحاويات البريدية غير المدرجة، لا ترمي أي وظيفة مبادلة استثناء ما لم يتم إلقاء هذا الاستثناء من خلال مبادلة تجزئة الحاوية أو كائن VED (إن وجد).
4 بالنسبة للحاويات الإرشادية غير المدرجة، إذا تم إلقاء استثناء من داخل وظيفة rehash () بخلاف وظيفة تجزئة الحاوية أو وظيفة المقارنة، فإن وظيفة rehash () لها أي تأثير.

23.3.3.3.4 معدلات Deque [Deque.modifiers]

void push_back (t && x)؛ الفقرة 2

ملاحظات: إذا تم إلقاء استثناء بخلاف منشئ النسخ، فقم بنقل المنشئ أو عامل التعيين أو نقل عامل التعيين من ر عدم وجود تأثيرات. إذا تم إلقاء استثناء بواسطة منشئ التحرك ل T غير قابل للتعديلات، فإن التأثيرات غير محددة.

محو ITERATOR (const_iterator أولا، const_iterator آخر)؛ الفقرة 6

يرمي: لا شيء ما لم يتم إلقاء استثناء من قبل منشئ النسخ أو نقل المنشئ أو عامل التعيين أو نقل عامل التعيين من ر.

23.3.6.5 ناقلات المعدلات [Vector.modifiers]

void push_back (t && x)؛ الفقرة 2

إذا تم إلقاء استثناء بواسطة منشئ التحرك ل T غير قابل للتطبيقات، فإن التأثيرات غير محددة.

محو ITERATOR (const_iterator أولا، const_iterator آخر)؛ الفقرة 5

يرمي: لا شيء ما لم يتم إلقاء استثناء من قبل منشئ النسخ أو نقل المنشئ أو عامل التعيين أو نقل عامل التعيين من ر.

الوثيقة التي ترتبط بها، مشروع معيار N3337، يمكن معالجتها كمسؤول. إنه التغييرات الافتتاحية التحريرية الطفيفة C ++ 11.

تحتاج فقط إلى تعلم قراءة المعيار، وهو أمر مفهوم لأنه ليس المقصود أن يكون من السهل قراءة.

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

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

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