সি ++ তে ভেক্টরগুলির উপরের তালিকাগুলি ব্যবহার করার বিন্দুটি কী?


32

আমি সি ++ তালিকা এবং ভেক্টরগুলির সাথে জড়িত 3 টি পৃথক পরীক্ষা চালিয়েছি।

মাঝখানে প্রচুর সংযোজন জড়িত থাকা সত্ত্বেও ভেক্টরযুক্তরা আরও দক্ষ প্রমাণিত হয়েছিল।

সুতরাং প্রশ্ন: কোন ক্ষেত্রে তালিকা ভেক্টরগুলির চেয়ে বেশি বোঝায়?

যদি বেশিরভাগ ক্ষেত্রে ভেক্টররা আরও দক্ষ বলে মনে হয় এবং তাদের সদস্যরা কতটা সমান হয় তা বিবেচনা করে, তবে তালিকার জন্য কোন সুবিধাটি বাকি আছে?

  1. এন পূর্ণসংখ্যা তৈরি করুন এবং সেগুলি একটি পাত্রে রাখুন যাতে ধারকটি সাজানো থাকে remains একের পর এক উপাদান পড়ার মাধ্যমে এবং প্রথম বৃহত্তরটির ঠিক আগে নতুনটি সন্নিবেশ করিয়ে সন্নিবেশটি নির্লজ্জভাবে সম্পাদন করা হয়েছে।
    একটি তালিকা সহ, সময়টি ছাদ দিয়ে যায় যখন ভেক্টরগুলির তুলনায় মাত্রা বৃদ্ধি পায়।

  2. ধারকটির শেষে এন পূর্ণসংখ্যা প্রবেশ করান।
    তালিকাগুলি এবং ভেক্টরগুলির জন্য, একই আকারের ক্রম দ্বারা সময় বৃদ্ধি পেয়েছিল, যদিও এটি ভেক্টরগুলির সাথে 3 গুণ বেশি দ্রুত ছিল।

  3. একটি পাত্রে এন পূর্ণসংখ্যা প্রবেশ করান।
    টাইমার শুরু করুন।
    List.sort ব্যবহার করে ধারকটি বাছাই করুন, তালিকাগুলির জন্য বাছাই করুন এবং ভেক্টরগুলির জন্য std :: সাজান। টাইমার বন্ধ করুন।
    আবার সময় একই ক্রমের পরিমাণের সাথে বৃদ্ধি পায় তবে এটি ভেক্টরগুলির সাথে গড়ে 5 গুণ দ্রুত হয়।

আমি পরীক্ষাগুলি চালিয়ে যেতে এবং কয়েকটি উদাহরণ বের করতে পারি যেখানে তালিকা আরও ভাল প্রমাণিত হয়।

আপনারা এই বার্তাটি পড়ার যৌথ অভিজ্ঞতা আরও উত্পাদনশীল উত্তর সরবরাহ করতে পারে।

আপনি হয়ত এমন পরিস্থিতিতে এসেছেন যেখানে তালিকাগুলি ব্যবহার করা আরও সুবিধাজনক ছিল, বা আরও ভাল সম্পাদন করা হয়েছিল?


2
আপনার অ্যারে / অ্যারে তালিকার সাথে সংযুক্ত তালিকাটি কখন ব্যবহার করবেন তা একবার দেখে নেওয়া উচিত ? আপনি ইতিমধ্যে যদি না থাকেন
কার্তিক টি

1
বিষয় সম্পর্কে এখানে আরও একটি ভাল সংস্থান রয়েছে: স্ট্যাকওভারফ্লো.com / a / 2209564 / 8360 এছাড়াও, আমি শুনেছি বেশিরভাগ সি ++ নির্দেশিকা ডিফল্টরূপে ভেক্টর ব্যবহার করা উচিত, কেবল যদি আপনার কোনও নির্দিষ্ট কারণ থাকে তবে তালিকাবদ্ধ করুন।
জাচারি ইয়েটস

ধন্যবাদ. তবে আমি প্রিয় উত্তরে যা বলেছি তার বেশিরভাগের সাথে একমত নই। এগুলির বেশিরভাগ প্রাক-ধারণা ধারণাগুলি আমার পরীক্ষাগুলি দ্বারা অবৈধ। এই ব্যক্তি কোনও পরীক্ষা করেনি এবং বই বা স্কুলে পড়ানো ব্যাপক তত্ত্ব প্রয়োগ করেন নি।
মারেক স্ট্যানলি

1
একজন listযদি আপনি উপাদান প্রচুর সরাচ্ছেন সম্ভবত ভাল আছে। আমি বিশ্বাস করি vectorনা যে পুরো ভেক্টর মোছা না হওয়া পর্যন্ত কোনও সিস্টেমে মেমরি ফিরিয়ে দেবে। এছাড়াও মনে রাখবেন যে আপনার পরীক্ষা # 1 একমাত্র সন্নিবেশের সময় পরীক্ষা করে নি। এটি অনুসন্ধান এবং সন্নিবেশকে সংযুক্ত করে একটি পরীক্ষা। এটি listস্লো isোকানোর জন্য জায়গাটি সন্ধান করা । প্রকৃত সন্নিবেশ ভেক্টরের চেয়ে দ্রুত হবে।
রোবট

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

উত্তর:


34

সংক্ষিপ্ত উত্তরটি হ'ল কেসগুলি খুব কম এবং খুব দূরবর্তী বলে মনে হচ্ছে। যদিও কিছু সম্ভবত আছে।

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

অন্যটি হ'ল / যদি আপনি কোনও শ্রোতার্তরকে একটি বর্ধিত সময়ের জন্য তালিকায় একটি "আকর্ষণীয়" পয়েন্টে সঞ্চয় করেন এবং যখন আপনি সন্নিবেশ এবং / অথবা মুছুনগুলি করেন, আপনি (প্রায়) সর্বদা এটির জায়গা থেকে যেখানে এটি করেন আপনার ইতিমধ্যে একটি পুনরাবৃত্তি রয়েছে, সুতরাং আপনি সন্নিবেশ বা মুছতে যেখানে চলেছেন সেই পয়েন্টে পৌঁছানোর জন্য আপনি তালিকার মধ্য দিয়ে হাঁটছেন না। স্পষ্টতই একইটি প্রযোজ্য যদি আপনি একাধিক স্পট নিয়ে কাজ করেন তবে আপনি যে জায়গাতেই কাজ করতে পারবেন তার জন্য পুনরাবৃত্তকারীকে সংরক্ষণ করার পরিকল্পনা করছেন, সুতরাং আপনি যে স্পটগুলিতে সরাসরি পৌঁছতে পারবেন তা বেশিরভাগ ক্ষেত্রেই হেরফের করেন এবং তালিকা পেতে খুব কমই হাঁটেন get সেই দাগগুলিতে

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

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

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

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

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


4
+1, তবে: আপনি যখন পয়েন্টার ব্যবহার করেন তখন প্রথম কেসটি অদৃশ্য হয়ে যায়, যা আপনার সর্বদা বড় অবজেক্টের সাথে ব্যবহার করা উচিত। লিঙ্কযুক্ত তালিকাগুলি দ্বিতীয়টির উদাহরণের জন্য উপযুক্ত নয়; যখন তারা খুব কম হয় তখন সমস্ত ক্রিয়াকলাপের জন্য অ্যারের মালিকানা থাকে ।
আমারা

2
বৃহত অবজেক্ট কেস মোটেই কাজ করে না। std::vectorপয়েন্টারগুলির একটি ব্যবহার করা আরও কার্যকর হবে তবে সেই লিঙ্কযুক্ত সমস্ত তালিকা নোড অবজেক্ট।
উইনস্টন ইওয়ার্ট

লিঙ্কযুক্ত তালিকার জন্য অনেকগুলি ব্যবহার রয়েছে - এটি কেবলমাত্র এগুলি যে গতিশীল অ্যারেগুলির মতো সাধারণ নয়। একটি এলআরইউ ক্যাশে একটি লিঙ্কযুক্ত তালিকার একটি সাধারণ ব্যবহার।
চার্লস সালভিয়া

এছাড়াও, একটি std::vector<std::unique_ptr<T>>ভাল বিকল্প হতে পারে।
হস্তান্তরকারী

24

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

তিনি এই উপস্থাপনা এ সম্পর্কে কথা বলেন ।

প্রায় 0:44 এ তিনি সাধারণভাবে ভেক্টর বনাম তালিকা সম্পর্কে কথা বলেন।

কমপ্যাক্টনেস বিষয়। ভেক্টর তালিকার চেয়ে কমপ্যাক্ট। এবং অনুমানযোগ্য ব্যবহারের নিদর্শনগুলি প্রচুর পরিমাণে। ভেক্টরগুলির সাহায্যে আপনাকে প্রচুর পরিমাণে উপাদান সরিয়ে ফেলতে হবে তবে ক্যাশেগুলি সত্যই এটির পক্ষে ভাল। ... তালিকার এলোমেলো অ্যাক্সেস নেই। আপনি যখন কোনও তালিকাটি অতিক্রম করেন, আপনি এলোমেলো অ্যাক্সেস করতে থাকেন। এখানে একটি নোড আছে, এবং এটি সেই নোডে চলে যায়, স্মৃতিতে। সুতরাং আপনি আসলে এলোমেলোভাবে আপনার স্মৃতি অ্যাক্সেস করছেন এবং আপনি আপনার ক্যাশে মিস করছেন যা আপনি যা চান তার ঠিক বিপরীত।

প্রায় 1:08 এ, তাকে এই সমস্যা সম্পর্কে একটি প্রশ্ন দেওয়া হয়।

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


1
আপনি "0:44 এবং 1:08 প্রায়" এর সাথে সংযোগ উপস্থাপনায় যা বলা হয়েছে তাতে সংক্ষেপে লিখতে আপত্তি করবেন ?
জিনাত

2
@ জাগান - অবশ্যই আমি পৃথক করে বোঝার জন্য স্টাফগুলি উদ্ধৃত করার চেষ্টা করেছি এবং স্লাইডগুলির প্রসঙ্গে এটির দরকার নেই।
পিট

11

আমি সাধারণত তালিকা ব্যবহার করি কেবলমাত্র সেই স্থানটি যেখানে আমাকে উপাদানগুলি মুছতে হবে এবং পুনরাবৃত্তকারীকে অবৈধ করতে হবে না। std::vectoriteোকানো এবং মুছতে সমস্ত পুনরাবৃত্তিকে অবৈধ করে। std::listগ্যারান্টি দেয় যে বিদ্যমান উপাদানগুলিতে পুনরাবৃত্তি সন্নিবেশ বা মোছার পরেও বৈধ।


4

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

তবে আপনার যদি এই অপারেশনগুলি করার প্রয়োজন না হয় তবে সম্ভবত না।


3

সংযুক্ত তালিকার অন্তর্নিহিত ক্যাশে / পৃষ্ঠা-বন্ধুত্বের অভাব তাদের প্রচুর সি ++ বিকাশকারীদের দ্বারা প্রায় সম্পূর্ণভাবে বরখাস্ত করে এবং সেই ডিফল্ট আকারে ভাল ন্যায়সঙ্গততার সাথে যুক্ত করে।

লিঙ্কযুক্ত তালিকাগুলি এখনও দুর্দান্ত হতে পারে

তা সত্ত্বেও লিঙ্ক তালিকা হতে পারে বিস্ময়কর যখন একটি নির্দিষ্ট বরাদ্দকরণ যে তাদের যে স্থানিক এলাকার তারা মজ্জাগতভাবে অভাব ফিরিয়ে দেয় মদদে।

যেখানে তারা উত্সাহ দেয় তা হ'ল আমরা একটি তালিকা দুটি তালিকায় বিভক্ত করতে পারি, উদাহরণস্বরূপ, কেবলমাত্র একটি নতুন পয়েন্টার সঞ্চয় করে এবং একটি বা দুটি পয়েন্টার ম্যানিপুলেট করে। আমরা কেবলমাত্র পয়েন্টার ম্যানিপুলেশন দ্বারা ধ্রুবক সময়ে একটি তালিকা থেকে অন্য তালিকায় নোডগুলি স্থানান্তর করতে পারি এবং একটি খালি তালিকায় কেবল একটি headপয়েন্টারের মেমরির ব্যয় থাকতে পারে ।

সাধারণ গ্রিড এক্সিলারেটর

ব্যবহারিক উদাহরণ হিসাবে, একটি 2 ডি ভিজ্যুয়াল সিমুলেশন বিবেচনা করুন। এটিতে একটি মানচিত্র সহ একটি স্ক্রোলিং স্ক্রিন রয়েছে যা 400x400 (160,000 গ্রিড কোষ) বিস্তৃত করে প্রতিটি ফ্রেমের চারদিকে ঘুরতে থাকা লক্ষ লক্ষ কণার মধ্যে সংঘর্ষ সনাক্তকরণের মতো জিনিসগুলিকে ত্বরান্বিত করার জন্য ব্যবহৃত হয় (আমরা এখানে কোয়াড-ট্রি এড়াতে পারি কারণ তারা এই স্তরের সাথে আরও খারাপ কাজ করার ঝোঁক রাখে we গতিশীল ডেটা)। একটি সম্পূর্ণ গুচ্ছ কণা প্রতিটি ফ্রেমে অবিচ্ছিন্নভাবে ঘোরাফেরা করে, যার অর্থ তারা ক্রমাগতভাবে একটি গ্রিড কোষে থাকা থেকে অন্য স্থানে চলে যায়।

এই ক্ষেত্রে, প্রতিটি কণা যদি এককভাবে সংযুক্ত তালিকার নোড হয় তবে প্রতিটি গ্রিড সেল কেবলমাত্র headপয়েন্টার হিসাবে শুরু করতে পারে যা নির্দেশ করে nullptr। যখন একটি নতুন কণা জন্মগ্রহণ করে, আমরা কেবল এটি গ্রিড সেলে headরাখি যা এই কণার নোডের দিকে নির্দেশ করার জন্য সেই ঘরের পয়েন্টারটি সেট করে এটি থাকে । যখন একটি কণা একটি গ্রিড ঘর থেকে অন্যটিতে চলে যায়, আমরা কেবল পয়েন্টারগুলি ম্যানিপুলেট করি।

vectorsপ্রতিটি গ্রিড কোষের জন্য 160,000 সঞ্চয় করা এবং ফ্রেম-বাই ফ্রেম ভিত্তিতে পুরো সময় মাঝখানে থেকে মুছে ফেলা এবং মোছার চেয়ে এটি আরও কার্যকর ।

এসটিডি :: তালিকা

এটি হ্যান্ড-রোলড, ইন্টুসিভ্যালি, সিঙ্গল-লিঙ্কযুক্ত তালিকার জন্য যদিও স্থির বরাদ্দকারী দ্বারা ব্যাক করা হয়। std::listদ্বিগুণ-সংযুক্ত তালিকার প্রতিনিধিত্ব করে এবং এটি একক পয়েন্টার হিসাবে ফাঁকা হয়ে গেলে প্রায় কমপ্যাক্ট নাও হতে পারে (বিক্রেতার প্রয়োগের সাথে পরিবর্তিত হয়), পাশাপাশি এটি কাস্টম বরাদ্দকারীকে std::allocatorআকারে প্রয়োগ করার জন্য এক ধরনের ব্যথা ।

আমি অবশ্যই স্বীকার করব যে আমি কখনই ব্যবহার করি না list। তবে লিঙ্কযুক্ত তালিকাগুলি এখনও দুর্দান্ত হতে পারে! তবুও তারা যে কারণে লোকেরা প্রায়শই তাদের ব্যবহারের জন্য প্রলুব্ধ করে তার জন্য তারা অসাধারণ নয়, যদি না তারা খুব দক্ষ নির্ধারিত বরাদ্দকারীকে সমর্থন না করে যা কমপক্ষে বাধ্যতামূলক পৃষ্ঠা সংক্রান্ত ত্রুটিগুলি এবং ক্যাশে মিস করে তবে অনেকগুলি প্রশমিত করে।


1
সি ++ 11 এর পর থেকে এখানে একটি মানসম্পন্ন একক-লিঙ্কযুক্ত তালিকা রয়েছে std::forward_list
sharyex

2

আপনি ধারক মধ্যে উপাদান আকার বিবেচনা করা উচিত।

int উপাদানগুলির ভেক্টরটি খুব দ্রুতগতির কারণ বেশিরভাগ ডেটা সিপিইউ ক্যাশের অভ্যন্তরে ফিট করে (এবং সিমডি নির্দেশাবলী সম্ভবত ডেটা অনুলিপি করার জন্য ব্যবহার করা যেতে পারে)।

যদি উপাদানটির আকার আরও বেশি হয় তবে পরীক্ষার ফলাফল 1 এবং 3 উল্লেখযোগ্যভাবে পরিবর্তন করতে পারে।

একটি খুব ব্যাপক কর্মক্ষমতা তুলনা থেকে :

এটি প্রতিটি ডেটা স্ট্রাকচারের ব্যবহারের উপর সাধারণ সিদ্ধান্তগুলি আঁকবে:

  • সংখ্যা ক্রাঞ্চিং: ব্যবহার std::vectorবাstd::deque
  • লিনিয়ার অনুসন্ধান: ব্যবহার std::vectorবাstd::deque
  • র্যান্ডম সন্নিবেশ / সরান:
    • ছোট ডেটা আকার: ব্যবহার std::vector
    • বৃহত উপাদানের আকার: ব্যবহার করুন std::list(যদি না মূলত অনুসন্ধানের জন্য উদ্দেশ্য হয়)
  • তুচ্ছ ডেটা টাইপ: std::listবিশেষত অনুসন্ধানের জন্য আপনার ধারকটির প্রয়োজন না হলে ব্যবহার করুন । তবে ধারকটির একাধিক পরিবর্তনের জন্য, এটি খুব ধীর হবে।
  • সামনে ঠেলা: ব্যবহার std::dequeবাstd::list

(পার্শ্ব নোট std::dequeহিসাবে একটি খুব কম মূল্যবান তথ্য কাঠামো)।

সুবিধামত দৃষ্টিকোণ থেকে std::listগ্যারান্টি সরবরাহ করা হয় যে আপনি অন্য উপাদানগুলি sertোকানো এবং মুছে ফেলার সাথে পুনরাবৃত্তিকারী কখনও অকার্যকর হবে না। এটি প্রায়শই একটি মূল দিক।


2

আমার মতে তালিকাগুলি ব্যবহারের সর্বাধিক সুস্পষ্ট কারণ হ'ল পুনরুক্তিযোগ্য অবৈধকরণ : আপনি যদি কোনও ভেক্টরের সাথে উপাদানগুলি যুক্ত / সরিয়ে থাকেন তবে সমস্ত পয়েন্টার, রেফারেন্স, পুনরাবৃত্তি যা আপনি এই ভেক্টরের নির্দিষ্ট উপাদানগুলিতে রেখেছিলেন তা অবৈধ হয়ে যেতে পারে এবং সূক্ষ্ম বাগগুলিতে পরিচালিত হতে পারে .. । বা বিভাজন ত্রুটি।

তালিকার ক্ষেত্রে এটি হয় না।

সমস্ত স্ট্যান্ডার্ড ওভারফ্লো পোস্টে স্ট্যান্ডার্ড কনটেইনারগুলির সুনির্দিষ্ট নিয়ম দেওয়া আছে


0

সংক্ষেপে, ব্যবহার করার কোনও ভাল কারণ নেই std::list<>:

  • আপনার যদি একটি চিকিত্সাবিহীন ধারক প্রয়োজন, std::vector<>নিয়ম করুন।
    (ভেক্টরের শেষ উপাদানটি প্রতিস্থাপন করে উপাদানগুলি মুছুন))

  • আপনার যদি বাছাই করা ধারক দরকার হয়, std::vector<shared_ptr<>>নিয়ম করুন।

  • আপনার যদি বিরল সূচক প্রয়োজন হয় তবে std::unordered_map<>নিয়ম করুন।

এটাই.

আমি দেখতে পাচ্ছি যে কেবলমাত্র একটি পরিস্থিতি যেখানে আমি একটি লিঙ্কযুক্ত তালিকা ব্যবহার করতে চাই: যখন আমার কাছে প্রাইসিসিস্টিং অবজেক্ট থাকে যা কিছু অতিরিক্ত অ্যাপ্লিকেশন যুক্তি বাস্তবায়নের জন্য কোনওভাবে সংযুক্ত হওয়া দরকার। তবে std::list<>সেক্ষেত্রে আমি কখনই ব্যবহার করি না , বরং আমি অবজেক্টের অভ্যন্তরে একটি (স্মার্ট) পরবর্তী পয়েন্টার অবলম্বন করি, বিশেষত যেহেতু বেশিরভাগ ব্যবহারের ক্ষেত্রে একটি লিনিয়ার তালিকার পরিবর্তে গাছ থাকে। কিছু ক্ষেত্রে, ফলস্বরূপ কাঠামোটি একটি লিঙ্কযুক্ত তালিকা, অন্যথায় এটি গাছ বা নির্দেশিত অ্যাসাইক্লিক গ্রাফ। এই পয়েন্টারগুলির প্রাথমিক উদ্দেশ্য সর্বদা লজিক্যাল স্ট্রাকচার তৈরি করা, কখনও কখনও অবজেক্টগুলি পরিচালনা না করা। আমরা এটা std::vector<>জন্য আছে ।


-1

আপনার প্রথম পরীক্ষায় আপনি কীভাবে সন্নিবেশ করছিলেন তা দেখাতে হবে need আপনার দ্বিতীয় এবং তৃতীয় পরীক্ষা, ভেক্টর সহজেই জিততে পারে।

তালিকার একটি উল্লেখযোগ্য ব্যবহার হ'ল পুনরাবৃত্তি করার সময় যখন আপনাকে আইটেমগুলি সরানোর পক্ষে সমর্থন করতে হয়। যখন ভেক্টরটি সংশোধন করা হয়, সমস্ত পুনরুক্তিকারী (সম্ভাব্য) অবৈধ। একটি তালিকা সহ, সরানো উপাদানটির কেবলমাত্র একটি পুনরাবৃত্তি অবৈধ। অন্যান্য সমস্ত পুনরাবৃত্তি বৈধ থাকে।

ধারকগুলির ব্যবহারের সাধারণ ক্রম হ'ল ভেক্টর, ডিউক, তারপরে তালিকা। ধারকটির পছন্দ সাধারণত পুশ_ব্যাক বেছে নিন ভেক্টর, পপ_ফ্রন্টটি বেছে নিন deque, chooseোকান তালিকার তালিকার উপর ভিত্তি করে।


3
পুনরাবৃত্তি করার সময় আইটেমগুলি সরানোর সময়, সাধারণত কোনও ভেক্টর ব্যবহার করা ভাল এবং ফলাফলের জন্য একটি নতুন ভেক্টর তৈরি করা ভাল
আমারা

-1

একটি বিষয় যা আমি ভাবতে পারি তা হ'ল ভেক্টর বাড়ার সাথে সাথে ফ্রি মেমরিটি খণ্ডিত হয়ে যাবে কারণ ভেক্টর তার স্মৃতিটিকে ক্ষুণ্ন করে এবং আরও বেশি বড় ব্লক বরাদ্দ করে। এটি তালিকাগুলিতে কোনও সমস্যা হবে না।

এটি এই সংখ্যার সত্যতা ছাড়াও push_backএটি রিজার্ভ ছাড়াই গুলি প্রতিটি পুনরায় আকার দেওয়ার সময় একটি অনুলিপিও সৃষ্টি করে যা এটি অক্ষম করে তোলেমাঝখানে similarোকানো একইভাবে সমস্ত উপাদানকে ডানে সরিয়ে নিয়ে যায় এবং আরও খারাপ।

আমি জানি না যদিও এটি কোনও প্রধান উদ্বেগ কিনা তবে ভেক্টরগুলি এড়ানোর জন্য আমার কাজের (মোবাইল গেম ডেভলপমেন্ট) এ আমাকে কারণ দেওয়া হয়েছিল।


1
না, ভেক্টর কপি করবে এবং এটি ব্যয়বহুল। তবে লিঙ্কযুক্ত তালিকার সন্ধান (কোথায় সন্নিবেশ করানো উচিত তা নির্ধারণের জন্য) ব্যয়বহুল। কীটি প্রকৃতপক্ষে পরিমাপ করা হচ্ছে
কেট গ্রেগরি

@ কেটগ্রিগরি আমার অর্থ ছাড়াও, আমাকে সেই অনুযায়ী সম্পাদনা করতে দিন
কার্তিক টি

3
ঠিক আছে, তবে এটি বিশ্বাস করুন বা না করুন (এবং বেশিরভাগ লোকেরা এটি বিশ্বাস করে না) আপনি যে কপিটি উল্লেখ করেননি, লিঙ্কযুক্ত তালিকাটি অতিক্রম করে সেই অনুলিপিগুলি কীভাবে সন্নিবেশ করানো হবে তা অনুসন্ধান করে (বিশেষত উপাদানগুলি ছোট (বা চলমান, কারণ যদি এগুলি চলমান)) এবং ভেক্টর প্রায়শই (বা এমনকি সাধারণত) দ্রুত হয়। এটা বিশ্বাস করি বা না.
কেট গ্রেগরি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.