যেহেতু উত্তরগুলির একটি অগণিত আছে, আপনি বিভ্রান্ত হতে পারেন, তবে সংক্ষেপে:
ব্যবহার ক std::queue
। এর কারণটি সহজ: এটি একটি ফিফো কাঠামো। আপনি ফিফো চান, আপনি একটি ব্যবহার করুন std::queue
।
এটি আপনার উদ্দেশ্য অন্য কারও কাছে এবং এমনকি নিজের কাছে পরিষ্কার করে দেয়। ক std::list
বা std::deque
না। একটি তালিকা যে কোনও জায়গায় sertোকাতে এবং মুছে ফেলতে পারে, যা কোনও ফিফো কাঠামোটি করণীয় বলে মনে করে না, এবং এটি deque
উভয় প্রান্ত থেকে যোগ এবং সরিয়ে ফেলতে পারে, যা ফিফোর কাঠামো কিছু করতে পারে না।
এজন্য আপনার একটি ব্যবহার করা উচিত queue
।
এখন, আপনি অভিনয় সম্পর্কে জিজ্ঞাসা করেছেন। প্রথমত, সর্বদা থাম্বের এই গুরুত্বপূর্ণ নিয়মটি মনে রাখবেন: ভাল কোড আগে, শেষ পারফরম্যান্স।
এর কারণটি সহজ: যে ব্যক্তিরা পরিচ্ছন্নতা এবং কমনীয়তার আগে পারফরম্যান্সের জন্য প্রচেষ্টা করেন তারা প্রায়শই শেষ করেন finish তাদের কোডটি মাশির ঝাল হয়ে যায়, কারণ সত্যিকার অর্থে এগুলি থেকে কিছু না পাওয়ার জন্য তারা যা কিছু ভাল তা ত্যাগ করেছে।
প্রথমে ভাল, পঠনযোগ্য কোড লিখে আপনার বেশিরভাগ কার্য সম্পাদনের সমস্যাগুলি তাদের সমাধান করবে। এবং যদি পরে আপনি দেখতে পান যে আপনার পারফরম্যান্সের অভাব রয়েছে, তবে এখন আপনার সুন্দর, পরিষ্কার কোডে কোনও প্রোফাইলার যুক্ত করা এবং সমস্যাটি কোথায় তা খুঁজে পাওয়া সহজ।
যা সব বলেছিল, std::queue
এটি কেবলমাত্র একটি অ্যাডাপ্টার। এটি নিরাপদ ইন্টারফেস সরবরাহ করে তবে অভ্যন্তরে একটি পৃথক ধারক ব্যবহার করে। আপনি এই অন্তর্নিহিত ধারকটি চয়ন করতে পারেন এবং এটি নমনীয়তার একটি ভাল ব্যবসার অনুমতি দেয়।
সুতরাং, আপনার কোন অন্তর্নিহিত ধারক ব্যবহার করা উচিত? আমরা সেটা জানি std::list
এবং std::deque
উভয় প্রয়োজনীয় ফাংশন প্রদান করেন ( push_back()
, pop_front()
, এবং front()
), তাই কীভাবে আমরা স্থির করবেন?
প্রথমত, বুঝতে হবে যে মেমরি বরাদ্দকরণ (এবং deallocating) করা কোনও দ্রুত কাজ নয়, সাধারণত, কারণ এটিতে ওএসে বেরিয়ে আসা এবং এটি কিছু করার জন্য জিজ্ঞাসা করা জড়িত। একটি list
মেমরি প্রতি একক সময় কিছু যোগ করা হয় বরাদ্দ, এবং এটি ডি-এলোকেট যখন এটি দূরে যায় করা হয়েছে।
এ deque
, অন্যদিকে খণ্ডে বরাদ্দ। এটি প্রায় একবারের চেয়ে কম বরাদ্দ হবে list
। এটিকে একটি তালিকা হিসাবে ভাবেন তবে প্রতিটি মেমরির অংশটি একাধিক নোড ধরে রাখতে পারে। (অবশ্যই, আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি এটি কীভাবে কাজ করে তা সত্যই শিখুন ))
সুতরাং, এই একা দিয়ে একটি deque
আরও ভাল অভিনয় করা উচিত, কারণ এটি মেমরির সাথে প্রায়শই ডিল করে না। আপনি ধ্রুব আকারের ডেটা পরিচালনা করছেন এমন তথ্যের সাথে মিশ্রিত হয়ে, সম্ভবত এটি প্রথম ডেটার মধ্য দিয়ে পাসের পরে বরাদ্দ করতে হবে না, তবে একটি তালিকা ক্রমাগত বরাদ্দ এবং অবনমিত হবে।
দ্বিতীয় জিনিসটি বুঝতে হবে ক্যাশে পারফরম্যান্স । র্যামে বের হওয়া ধীর গতির, সুতরাং যখন সিপিইউর সত্যই প্রয়োজন হয়, তখন এটি একবারের সাথে মেমরির একটি অংশ নিয়ে ক্যাশে নিয়ে যাওয়ার মাধ্যমে এই সময়ের সেরাটি তৈরি করে। কারণ deque
মেমরি খণ্ডে একটি বরাদ্দ, সম্ভবত এই ধারকটিতে কোনও উপাদান অ্যাক্সেস করার ফলে সিপিইউ বাকী ধারকটিও আবার ফিরিয়ে আনতে পারে। এখন আর কোনও অ্যাক্সেস deque
দ্রুত হবে, কারণ ডেটা ক্যাশে রয়েছে।
এটি তালিকার বিপরীতে, যেখানে ডেটা একসাথে একবারে বরাদ্দ করা হয়। এর অর্থ মেমরির সমস্ত জায়গায় ডেটা ছড়িয়ে দেওয়া যেতে পারে এবং ক্যাশের কার্যকারিতা খারাপ হবে।
সুতরাং, এটি বিবেচনা করে, deque
একটি আরও ভাল পছন্দ হওয়া উচিত। এজন্য এটি ব্যবহার করার সময় এটি ডিফল্ট ধারক queue
। এই সমস্ত যা বলেছিল, এটি এখনও একটি (খুব) শিক্ষিত অনুমান: আপনাকে অবশ্যই এই কোডটি প্রোফাইল করতে হবে, একটি deque
পরীক্ষায় এবং list
অন্যটিতে সত্যিকারের জন্য নিশ্চিতভাবে ব্যবহার করতে।
তবে মনে রাখবেন: একটি ক্লিন ইন্টারফেসের সাথে কোডটি কাজ করুন, তারপরে পারফরম্যান্স সম্পর্কে চিন্তিত।
জন উদ্বেগ উত্থাপন করে যে একটি list
বা মোড়ানো deque
একটি কার্যকারিতা হ্রাস ঘটায়। আবার, তিনি বা আমি নিজেরাই এটির প্রোফাইল না দিয়ে নির্দিষ্ট করে বলতে পারি, তবে সম্ভাবনা হ'ল সংকলক যে কলগুলি করবে সেগুলি ইনলাইন করবে queue
। এটি হ'ল, যখন আপনি বলবেন queue.push()
, এটি সত্যিই কেবল বলে দেবে queue.container.push_back()
, ফাংশন কলটি পুরোপুরি বাদ দেওয়া।
আবার, এটি কেবল শিক্ষিত অনুমান, তবে queue
অন্তর্নিহিত ধারক কাঁচা ব্যবহারের তুলনায় যখন ব্যবহার করা হয় তবে কার্যকারিতা হ্রাস পাবে না। যেমনটি আমি আগে বলেছি, ব্যবহার করুন queue
, কারণ এটি পরিষ্কার, সহজেই ব্যবহারযোগ্য এবং নিরাপদ এবং যদি এটি সত্যিই সমস্যা প্রোফাইল এবং পরীক্ষায় পরিণত হয়।