কেন std :: স্ট্যাকটি std :: deque ডিফল্টরূপে ব্যবহার করে?


91

যেহেতু একটি পাত্রে স্ট্যাকের জন্য ব্যবহৃত কেবলমাত্র অপারেশনগুলি হ'ল:

  • পেছনে()
  • ফেরত পাঠাও()
  • ফিরে পপ()

কেন এটির জন্য ডিফল্ট ধারকটি কোনও ভেক্টরের পরিবর্তে প্রশংসনীয়?

ডীক রিঅলোকেশনগুলি সামনে () এর আগে উপাদানগুলির একটি বাফার দেয় না যাতে পুশ_ফ্রন্ট () একটি কার্যকর অপারেশন? এই উপাদানগুলি কখনই কোনও স্ট্যাকের প্রসঙ্গে ব্যবহার করা হবে না সেগুলি নষ্ট হয় না?

যদি কোনও ভেক্টরের পরিবর্তে এইভাবে কোনও ডেক ব্যবহার করার জন্য কোনও ওভারহেড না থাকে তবে অগ্রাধিকারের জন্য ডিফল্ট কেন_ ভেক্টরকেও ডেক নয়? (অগ্রাধিকার_ক্যুতে সামনে (), পুশ_ব্যাক () এবং পপব্যাক () প্রয়োজন হয় মূলত স্ট্যাকের মতো))


নীচের উত্তরের ভিত্তিতে আপডেট হয়েছে:

এটি প্রদর্শিত হয় যে ডীকটি সাধারণত প্রয়োগ করা হয় তা স্থির আকারের অ্যারেগুলির একটি পরিবর্তনশীল আকারের অ্যারে। এটি কোনও ভেক্টরের চেয়ে দ্রুত বর্ধমান হয়ে ওঠে (যার পুনঃনির্ধারণ এবং অনুলিপি প্রয়োজন), তাই উপাদানগুলির যোগ এবং অপসারণ সম্পর্কে স্ট্যাকের মতো কোনও কিছুর জন্য, সম্ভবত সম্ভবত পছন্দ একটি ভাল পছন্দ।

অগ্রাধিকার_ক্যুতে ভারীভাবে সূচক প্রয়োজন, প্রতিটি অপসারণ এবং সন্নিবেশের জন্য আপনাকে পপ-হিপ () বা পুশ_ইপ () চালানো দরকার। এটি সম্ভবত ভেক্টরকে আরও ভাল পছন্দ করে তোলে কারণ যে কোনও উপায়ে যোগ করা এখনও যেভাবে স্থির থাকে।


4
আপনার 'আপডেট' এর যুক্তিটি ঠিক সঠিক নয়। ভেক্টর সাধারণত একটি ডেকের চেয়ে দ্রুত প্রান্ত থেকে উপাদানগুলি যুক্ত করে এবং সরিয়ে দেয় । ডেকিং ক্রমহ্রাসমান মেমরির জন্য দ্রুত , উপাদানগুলিকে চাপ না দিয়ে।
মাকিং হাঁস

উত্তর:


75

ধারকটি বাড়ার সাথে সাথে কোনও ভেক্টরের পুনঃস্থাপনের জন্য সমস্ত উপাদান মেমরির নতুন ব্লকে অনুলিপি করা প্রয়োজন। একটি ডীক বাড়ানো একটি নতুন ব্লক বরাদ্দ করে এবং এটি ব্লকের তালিকায় লিঙ্ক করে - কোনও অনুলিপি প্রয়োজন হয় না।

অবশ্যই আপনি নির্দিষ্ট করতে পারেন যে আপনার পছন্দ মতো একটি ভিন্ন ব্যাকিং পাত্রে ব্যবহৃত হবে। সুতরাং আপনার যদি এমন একটি স্ট্যাক থাকে যা আপনি জানেন যে খুব বেশি বৃদ্ধি পাবে না, তবে এটি আপনার পছন্দ হিসাবে যদি ডেকের পরিবর্তে কোনও ভেক্টর ব্যবহার করতে বলুন।


4
তবে যখন ব্লকগুলিতে পয়েন্টারগুলির তালিকাটি বৃদ্ধি পায়, তখন এই তালিকাটি মাঝে মধ্যে আবার কোনও ভেক্টরকে অবশ্যই পুনরায় স্থান দিতে হবে; অ্যাসেম্পোটোটিকভাবে, দক্ষতার কোনও লাভ হ'ল সর্বোপরি ধ্রুবক ফ্যাক্টর দ্বারা। আর পুনরুক্তিকারীর ম্যানিপুলেশন ধাক্কা এবং সঠিকভাবে পপ আরো অনেক কিছু জন্য জটিল করা প্রয়োজন std::dequeতুলনায় এটি জন্য std::vector, এবং এই অপারেশন reallocations চেয়ে অনেক বেশি ঘন ঘন ব্যবহার করা যেতে করার সম্ভাবনা বেশি। আমার বিশ্বাস করতে std::dequeখুব কষ্ট std::vectorহয় যা অনুশীলনে কখনও পরাজিত হয়।
মার্ক ভ্যান লিউউইন

@ মিশেল বুড়: তাহলে কেন ব্যবহার করবেন না list, কেন deque?
বাপাক

আপনার সম্পর্কে @ মার্কওয়ানলিউউইন বলেছেন যে বিশ্বাস করতে আপনার খুব কষ্ট হয়েছে ... আপনি কি দয়া করে একটি স্পষ্ট অবস্থান নিতে পারেন? আপনি কি বোঝাতে চেয়েছেন যে আপনি এখন বিশ্বাস করছেন যে অনুশীলনে std::dequeপরাজিত করার কোনও সুযোগ আছে std::vector, বা আপনি কি এখনও সন্দেহ করছেন বলে মনে করেন? ধন্যবাদ
আফফুলি

@ ফ্লিক্স আমি ব্যক্তিগতভাবে বিশ্বাস করি যে এটি ব্যক্তিগতভাবে বিশ্বাস করার জন্য আরও সহজ সময় আছে যা ব্যবহারিক প্রয়োগগুলির std::dequeপাশাপাশি std::vectorকার্যকর হবে কেন আমি এটি এত গুরুত্বপূর্ণ না । তবে এর মূল্য কী, তার জন্য আমার ব্যক্তিগত অভিজ্ঞতাটি হ'ল যে আমার একটি বড় এবং জটিলতা-গুরুত্বপূর্ণ কাজের জন্য নয়, অনেকগুলি ছোট ছোট অনুষ্ঠানের জন্য আমার কোডের মাধ্যমে ছড়িয়ে দেওয়া I এরকম হিসাবে আমি বৃহত্তর তুলনায় ছোট মধ্যে আচরণ সম্পর্কে বেশি যত্নশীল; এবং deque সেখানে বিশেষ করে নিস্তেজ shines। আমার অগ্রাধিকার হ'ল উভয়ই ব্যবহার না করা, তবে (স্ব-বাস্তবায়িত) পরিবর্তে একক লিঙ্কযুক্ত তালিকাগুলি। তবে আপনি মাইলেজ বিভিন্ন হতে পারে।
মার্ক ভ্যান লিউউইন

12

ভেক্টর এবং ডেকের তুলনামূলক যোগ্যতার জন্য হরব সুটারের সপ্তাহ 54 এর গুরুটি দেখুন যেখানে হয়।

আমি কল্পনা করি যে অগ্রাধিকার_ক্যু এবং সারিটির মধ্যে অসঙ্গতি কেবল এই যে বিভিন্ন লোক তাদের প্রয়োগ করেছে।


4
অগ্রাধিকার_কিউ আসলে পুশ / পপ_ফ্রন্ট ব্যবহার করে না এবং প্রথমটি ছাড়াও উপাদানগুলির রেফারেন্সগুলি হ্যাপ অপারেশন দ্বারা অবৈধ। সুতরাং, ডীকের কোনও সুবিধাই প্রযোজ্য হবে না, নিয়মিত সারির ক্ষেত্রে বিপরীতে।
পোটোটোওয়াত্টার

9
এছাড়াও, priority_queueঅবশ্যই বাছাই করতে হবে, তাই এলোমেলোভাবে অ্যাক্সেসের উচ্চতর ওভারহেড deque::iteratorআরও সমস্যাযুক্ত।
পোটোসওয়টার

4
@ পোটাটোসওয়টার: priority_queueএর একটি "ম্যাজিক অর্ডার" রয়েছে যা বজায় থাকে, এটি সাজানো হয় না। যাইহোক, আপনার পয়েন্ট দাঁড়িয়ে।
মাকিং হাঁস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.