في أي سيناريو يمكنني استخدام حاوية STL معينة؟

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

  •  19-08-2019
  •  | 
  •  

سؤال

لقد قرأت عن حاويات STL في كتابي عن C++، وتحديدًا القسم الخاص بـ STL وحاوياتها.الآن أفهم أن كل واحدة منها لها خصائصها الخاصة، وأنا على وشك حفظها جميعًا...لكن ما لم أفهمه بعد هو السيناريو الذي يتم فيه استخدام كل واحد منهم.

ما هو التفسير؟رمز المثال هو المفضل كثيرا.

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

المحلول

هذا الغش ورقة ملخصا جيدة للحاويات مختلفة.

واطلع على سير في أسفل كدليل على التي لاستخدامها في سيناريوهات الاستخدام المختلفة:

<الفرعية> ديفيد مور و <لأ href = "http://creativecommons.org/ تراخيص / مشاركات sa-/ 3.0 / نيوزيلندي / "يختلط =" noreferrer "> CC BY-SA المرخصة 3.0

نصائح أخرى

وهنا هو مخطط مستوحاة من النسخة ديفيد مور (انظر أعلاه) بأنني خلقت، وهو ما يصل إلى التاريخ (في الغالب) مع المعيار الجديد (C ++ 11). هذه ليست سوى بلدي يأخذ الشخصية على ذلك، فإنه لا جدال فيه، ولكني أحسب أنه قد يكون من المفيد في هذا النقاش:

والجواب بسيط: استخدام std::vector عن كل شيء إلا إذا كان لديك سبب حقيقي للقيام خلاف ذلك

وعندما تجد حالة حيث كنت أفكر، "جي، std::vector لا يعمل بشكل جيد هنا بسبب X"، انتقل على أساس X.

وانظروا STL الفعالة التي كتبها سكوت مايرز. انها جيدة في شرح كيفية استخدام STL.

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

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

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

إذا كان لديك الكثير من أزواج قيمة المفتاح، وتريد فرزها بواسطة مفتاح، ثم خريطة مفيدة ... لكنه لن تعقد فقط قيمة واحدة لكل مفتاح. إذا كنت بحاجة إلى أكثر من قيمة لكل مفتاح، هل يمكن أن يكون ناقلا / قائمة كقيمة بك في الخريطة، أو استخدام multimap.

وانها ليست في المحكمة الخاصة بلبنان، وإنما هو في التحديث TR1 إلى المحكمة الخاصة بلبنان: إذا كان لديك الكثير من أزواج قيمة المفتاح-أنك ذاهب للبحث عن بواسطة مفتاح، وكنت لا يهتمون ترتيبها ، قد ترغب في استخدام التجزئة - وهو TR1 :: unordered_map. لقد استعملت مع Visual C ++ 7.1، حيث كان يطلق عليه stdext :: hash_map. كان لديه بحث من O (1) بدلا من البحث من O (سجل ن) للخريطة.

لقد قمت بإعادة تصميم المخطط الانسيابي ليحتوي على 3 خصائص:

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

المخطط الانسيابي: enter image description here

مزيد من المعلومات المقدمة في هذا الرابط.

وهذه نقطة مهمة لفترة وجيزة فقط المذكورة حتى الآن، هو أنه إذا كنت تحتاج إلى الذاكرة القريبة (مثل يعطي مجموعة C)، ثم يمكنك استخدام فقط vector، array، أو string.

استخدم array إذا عرف حجم في وقت الترجمة.

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

استخدم vector في جميع الحالات الأخرى (يجب أن يكون vector الخيار الافتراضي من الحاويات في معظم الحالات على أي حال).

ومع كل ثلاثة من هذه يمكنك استخدام الدالة العضو data() للحصول على مؤشر إلى العنصر الأول من الحاوية.

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

وvector: تخطيط الاتفاق مع ضئيلة أو معدومة فوق الذاكرة لكل كائن الواردة. كفاءة تكرار انتهى. إلحاق، إدراج ومحو يمكن أن تكون مكلفة، ولا سيما بالنسبة للكائنات معقدة. رخيصة للعثور على وجوه الواردة في المؤشر، على سبيل المثال myVector [10]. استخدام حيث كنت قد استخدمت صفيف في C. جيد حيث لديك الكثير من أشياء بسيطة (مثل كثافة العمليات). لا تنسى أن استخدام reserve() قبل أن يضيف الكثير من الكائنات إلى الحاوية.

وlist: صغير فوق الذاكرة لكل كائن الواردة. كفاءة تكرار انتهى. إلحاق، إدراج ومحو رخيصة. استخدام حيث كنت قد استخدمت قائمة مرتبطة في C.

وsetmultiset): كبير فوق الذاكرة لكل كائن الواردة. استخدام حيث كنت في حاجة لمعرفة بسرعة إذا تلك الحاوية تحتوي على كائن معين، أو دمج حاويات بكفاءة.

وmapmultimap): كبير فوق الذاكرة لكل كائن الواردة. استخدام حيث تريد تخزين أزواج قيمة المفتاح والبحث عن قيم بواسطة مفتاح بسرعة.

وعلى الرسم البياني للتدفق على الغش ورقة البحث اقترحه zdan تقدم دليل أكثر شمولا.

وأحد الدروس التي تعلمتها هو: محاولة لالتفاف عليه في فئة، منذ تغيير نوع الحاوية يوم واحد على ما يرام يمكن أن تسفر عن مفاجآت كبيرة.

class CollectionOfFoo {
    Collection<Foo*> foos;
    .. delegate methods specifically 
}

وأنها لا تكلف كثيرا في خط الهجوم، ويوفر الوقت في التصحيح عندما تريد كسر كلما شخص يفعل عملية x على هذا الهيكل.

والقادمة لاختيار بنية البيانات مثالية للعمل:

وكل بنية بيانات يوفر بعض العمليات، والتي يمكن متفاوتة تعقيد الوقت:

وO (1)، O (إل جي N)، O (N)، وغيرها.

لديك أساسا لاتخاذ أفضل تخمين، في العمليات التي سيتم القيام به أكثر، واستخدام هياكل البيانات التي لديها تلك العملية كما O (1).

وبسيط، أليس كذلك (-:

ولقد أجبت على هذا السؤال في آخر التي تم وضع علامة على الحزب الاتحادي الديمقراطي من هذا واحد. لكني أشعر أنه من الجميل أن أشير إلى بعض المواد الجيدة بشأن قرار اختيار حاوية قياسية.

وكما أجابDavid Thornley، الأمراض المنقولة جنسيا :: ناقلات هو الطريق للذهاب إذا لم تكن هناك احتياجات خاصة أخرى. هذه هي النصيحة التي قدمها خالق C ++، بيارن ستروستروب في 2014 بلوق.

وهنا هو الرابط لهذه المادة https://isocpp.org/blog/2014/06/stroustrup-lists

واقتبس من أن واحد،

<اقتباس فقرة>   

و، نعم، توصيتي هي استخدام الأمراض المنقولة جنسيا :: ناقلات افتراضيا.

في التعليقات، ويوفرNathanOliver المستخدم أيضا بلوق أخرى جيدة، والتي لديها اكثر من قياسات محددة. https://baptiste-wicht.com/ الردود / 2012/12 / حزب الشعب الكمبودي-المؤشر-ناقلات قائمة deque.html .

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