"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > هل `std::list::size()` حقًا O(1) في تطبيقات C++ الحديثة؟

هل `std::list::size()` حقًا O(1) في تطبيقات C++ الحديثة؟

تم النشر بتاريخ 2024-11-17
تصفح:680

Is `std::list::size()` Truly O(1) in Modern C   Implementations?

هل std::list::size() حقًا O(n) في التطبيقات الحديثة؟

في الآونة الأخيرة، اقترح بعض المطورين ذلك std::list::size() لها تعقيد زمني خطي (O(n)). ومع ذلك، وفقًا لمعيار C، لم يتم تعريف التعقيد وقد يختلف اعتمادًا على التنفيذ.

في الإصدارات السابقة من معيار C (C 03)، يوصى باستخدام عملية size() لتكون ذات تعقيد ثابت. (س(1)). ومع ذلك، مع إدخال C 11، أصبح مطلبًا لجميع الحاويات القياسية. ينص الجدول 96 من معيار C 11 صراحةً على أن .size() يجب أن يكون له تعقيد ثابت لجميع الحاويات.

تاريخيًا، نفذت مكتبة libstdc في دول مجلس التعاون الخليجي size() مع التعقيد O(n) باستخدام std::distance(begin) ()، end())، كما هو موضح في إدخال المدونة الذي استشهدت به. ومع ذلك، في وضع C 11، تغير هذا السلوك:

size_type
size() const _GLIBCXX_NOEXCEPT
{ return __size_alloc_.first(); }

_LIBCPP_INLINE_VISIBILITY
const size_type& __sz() const _NOEXCEPT
    {return __size_alloc_.first();}

في الإصدار 5.0 من دول مجلس التعاون الخليجي والإصدارات الأحدث، تستخدم الدالة size() بنية بيانات داخلية لتتبع عدد العناصر، مما يجعل العملية O(1) فعالة. يتوافق هذا مع متطلبات C 11 لجميع الحاويات القياسية.

من المهم ملاحظة أن بعض حالات الاستخدام المتخصصة قد تؤدي إلى تعقيد O(n) لـ size()، ولكن بالنسبة للغالبية العظمى من المستخدمين، فإن يجب أن تكون العملية بوقت ثابت.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3