আমি কীভাবে দক্ষতার সাথে সি ++ 11 এ একটি স্ট্যান্ডার্ড লাইব্রেরি ধারক নির্বাচন করতে পারি?


135

"সি ++ কনটেইনার পছন্দ" নামে একটি সুপরিচিত চিত্র (প্রতারণা পত্রক) রয়েছে। পছন্দসই ব্যবহারের জন্য সেরা ধারক চয়ন করার জন্য এটি একটি ফ্লো চার্ট।

ইতিমধ্যে এর C ++ 11 সংস্করণ রয়েছে কিনা তা কি কেউ জানেন?

এটি আগেরটি: ইসি ++ ধারক পছন্দ


6
এর আগে কখনও দেখিনি। ধন্যবাদ!
উইজেলফক্স

6
@ উইলসফক্স: এটি ইতিমধ্যে সি ++ এর একটি অংশ - এসও-তে এখানে ফ্যাক্স ।
অলোক

4
সি ++ 11 কেবলমাত্র একটি নতুন সত্য ধারক প্রবর্তন করেছে: আনর্ডারড_এক্স কনটেইনার। হ্যাশ-টেবিলটি উপযুক্ত কিনা তা সিদ্ধান্ত নেওয়ার সময় অনেকগুলি বিবেচনা করার কারণে সেগুলি সহ কেবলমাত্র টেবিলটিকে যথেষ্ট গণ্ডগোল করে দেবে।
নিকল বলাস

13
জেমস ঠিক বলেছেন, টেবিলটি যা দেখায় তার চেয়ে ভেক্টর ব্যবহার করার মতো আরও অনেকগুলি মামলা রয়েছে। ডেটা লোকালটির সুবিধা কিছু ক্ষেত্রে দক্ষতার অভাবের ক্ষেত্রে অনেক ক্ষেত্রে দক্ষতার বাইরে চলে যায় (আরও শীঘ্রই সি ++ 11)। এমনকি সি ++ 03 এর জন্যও আমি ই-চার্টটি এত দরকারী বলে খুঁজে পাই না
ডেভিড রদ্রিগেজ - ড্রিবিস

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

উত্তর:


97

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

এই জাতীয় চার্ট তৈরি করতে আপনার কেবল দুটি সহজ গাইডলাইন প্রয়োজন:

  • প্রথমে শব্দার্থবিজ্ঞানের জন্য বেছে নিন
  • যখন বেশ কয়েকটি পছন্দ উপলভ্য থাকে, তখন সরলতমটিতে যান

পারফরম্যান্স নিয়ে চিন্তিত হওয়া প্রথমে প্রথমে অকেজো। আপনি যখন কয়েক হাজার (বা আরও বেশি) আইটেম পরিচালনা করতে শুরু করেন তখন বড় হে বিবেচনাগুলি কেবল সত্যই কিক হয় kick

দুটি বড় ধরণের পাত্রে রয়েছে:

  • সহযোগী পাত্রে: তাদের একটি findঅপারেশন রয়েছে
  • সাধারণ সিকোয়েন্স পাত্রে

এবং তারপর আপনি তাদের উপরে বিভিন্ন অ্যাডাপ্টারের নির্মাণ করতে পারেন: stack, queue, priority_queue। আমি অ্যাডাপ্টারগুলি এখানে রেখে দেব, সেগুলি সনাক্তকরণের জন্য যথেষ্ট দক্ষ are


প্রশ্ন 1: সহযোগী ?

  • আপনার যদি সহজেই একটি কী দ্বারা অনুসন্ধান করতে হয় তবে আপনার প্রয়োজন একটি সাহসী ধারক
  • আপনার যদি উপাদানগুলি বাছাই করতে হয় তবে আপনার প্রয়োজন একটি অর্ডারযুক্ত সাহসী ধারক
  • অন্যথায়, প্রশ্ন 2 এ ঝাঁপ দাও।

প্রশ্ন 1.1: আদেশ দেওয়া হয়েছে ?

  • আপনার যদি নির্দিষ্ট আদেশের প্রয়োজন না হয় তবে একটি unordered_ধারক ব্যবহার করুন, অন্যথায় এটির traditionalতিহ্যবাহী অর্ডার করা অংশটি ব্যবহার করুন।

প্রশ্ন 1.2: পৃথক কী ?

  • কীটি মান থেকে পৃথক হলে, ব্যবহার করুন map, অন্যথায় একটি ব্যবহার করুনset

প্রশ্ন 1.3: সদৃশ ?

  • আপনি যদি নকল রাখতে চান তবে একটি ব্যবহার করুন multi, অন্যথায় তা করবেন না।

উদাহরণ:

মনে করুন যে আমার সাথে এক অনন্য আইডি যুক্ত বেশ কয়েকজন ব্যক্তি রয়েছেন এবং আমি তার আইডি থেকে যতটা সম্ভব সম্ভব কোনও ব্যক্তির ডেটা পুনরুদ্ধার করতে চাই।

  1. আমি একটি findফাংশন চাই , এইভাবে একটি সাহসী ধারক

    1.1। আমি অর্ডার সম্পর্কে কম যত্ন নিতে পারি না, এইভাবে একটি unordered_ধারক

    1.2। আমার কী (আইডি) এর সাথে সম্পর্কিত মানটির থেকে পৃথক, এইভাবে কmap

    1.3। আইডি অনন্য, সুতরাং কোনও সদৃশ প্রবেশ করা উচিত নয়।

চূড়ান্ত জবাব হচ্ছে, std::unordered_map<ID, PersonData>


প্রশ্ন 2: স্মৃতি স্থিতিশীল ?

  • যদি উপাদানগুলি মেমোরিতে স্থিতিশীল হওয়া উচিত (যেমন, ধারক নিজেই সংশোধন করা হয় তখন এগুলি চারপাশে চলবে না) তবে কিছু ব্যবহার করুন list
  • অন্যথায়, প্রশ্ন 3 এ ঝাঁপুন।

প্রশ্ন 2.1: কোনটি ?

  • একটি জন্য নিষ্পত্তি list; একটি forward_listশুধুমাত্র কম মেমরির পদচিহ্নের জন্য দরকারী।

প্রশ্ন 3: গতিশীল আকারের ?

  • যদি ধারকটির একটি পরিচিত আকার থাকে (সংকলনের সময়), এবং প্রোগ্রামের সময় এই আকারটি পরিবর্তন করা হবে না এবং উপাদানগুলি ডিফল্ট গঠনযোগ্য বা আপনি একটি সম্পূর্ণ সূচনা তালিকা সরবরাহ করতে পারেন ( { ... }সিনট্যাক্স ব্যবহার করে ), তারপরে একটি ব্যবহার করুন array। এটি প্রচলিত সি-অ্যারে প্রতিস্থাপন করে তবে সুবিধাজনক ফাংশন সহ।
  • অন্যথায়, প্রশ্ন 4 এ লাফ দিন।

প্রশ্ন 4: দ্বৈত-সমাপ্ত ?

  • আপনি যদি সামনের এবং পিছনে উভয় থেকে আইটেমগুলি সরাতে সক্ষম হতে চান তবে একটি ব্যবহার করুন deque, অন্যথায় একটি ব্যবহার করুন vector

আপনি নোট করবেন যে ডিফল্টরূপে, যদি না আপনার কোনও এসোসিয়েটিভ ধারক প্রয়োজন হয়, আপনার পছন্দটি একটি হবে vector। দেখা যাচ্ছে এটি সুটার এবং স্ট্রাস্ট্রপের সুপারিশও


5
+1, তবে কয়েকটি নোট সহ: 1) arrayডিফল্ট গঠনমূলক ধরণের প্রয়োজন হয় না; 2) এস বাছাইয়ের ক্ষেত্রে multiডুপ্লিকেট অনুমোদিত হওয়ার বিষয়ে তেমন কিছু নয় তবে সেগুলি রাখার বিষয়টি সম্পর্কে (আপনি নকলগুলি নন- multiধারক পাত্রে রাখতে পারেন, এটি ঘটে কেবলমাত্র একটি রাখা হয়)।
আর মার্টিনহো ফার্নান্দিস

2
উদাহরণটি কিছুটা বন্ধ। 1) আমরা "দক্ষতার সাথে" সন্ধান করতে চাইলে আমরা "সন্ধান" করতে পারি (সদস্য ফাংশনটি নয়, "<ক্যালগরিদম>" এক), একটি অ্যাসোসিয়েটিভ পাত্রে, 1.1) এবং অন-অর্ডারযুক্ত ও (O) (O) হবে না ও ( লগ এন)।
ব্ল্যাকব্যাট

4
@ ব্লাকব্যাট: যদিও তুলনামূলকভাবে map.find(key)অনেক বেশি প্রসারণযোগ্য std::find(map.begin(), map.end(), [&](decltype(map.front()) p) { return p.first < key; }));, তাই এটি অর্থাত্পকভাবে গুরুত্বপূর্ণ, এটি সেই findসদস্যের চেয়ে বরং সদস্যের কাজ <algorithm>। ও (1) বনাম ও (লগ এন) হিসাবে, এটি শব্দার্থকে প্রভাবিত করে না; আমি উদাহরণ থেকে "দক্ষতা" মুছে ফেলব এবং এটিকে "সহজেই" দিয়ে প্রতিস্থাপন করব।
ম্যাথিউ এম।

"যদি উপাদানগুলিকে স্মৃতিতে স্থিতিশীল করা উচিত ... তবে কিছু তালিকা ব্যবহার করুন" ... হুম, আমি ভেবেছিলাম dequeএই সম্পত্তিটিও কি আছে?
মার্টিন বা

@ মার্টিনবা: হ্যাঁ এবং না। একটি dequeউপাদানের স্থিতিশীল হয় শুধুমাত্র যদি আপনি ধাক্কা পারেন শেষে / POP; আপনি যদি মাঝখানে সন্নিবেশ / মুছতে শুরু করেন তবে তৈরি করা শূন্যস্থান পূরণ করতে N / 2 টি উপাদান পর্যন্ত পরিবর্তন করা হবে।
ম্যাথিউ এম।

51

আমি ম্যাথিউয়ের উত্তরটি পছন্দ করি তবে আমি ফ্লোচার্টটিকে এটি আবার চালু করতে যাচ্ছি:

যখন std :: ভেক্টর ব্যবহার করবেন না

ডিফল্টরূপে, আপনার যদি স্টাফের ধারক দরকার হয় তবে ব্যবহার করুন std::vector। সুতরাং, প্রতিটি অন্যান্য ধারক কেবল কিছু কার্যকারিতা বিকল্প সরবরাহ করে ন্যায্য std::vector

কন্সট্রাকটর

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

std::dequeহ'ল সাধারণ প্রতিস্থাপন, এর অনেকগুলি বৈশিষ্ট্য রয়েছে std::vectorতবে আপনি কেবলমাত্র ডেকের উভয় প্রান্তে সন্নিবেশ করতে পারেন। মাঝখানে সন্নিবেশ করানো প্রয়োজন। একটি std::listবিষয়বস্তুতে কোনও প্রয়োজন রাখে না।

প্রয়োজন বুলস

std::vector<bool>এটি না. ভাল, এটা মান। তবে এটি vectorসাধারণ অর্থে কোনও নয়, কারণ std::vectorসাধারণত পরিচালনা করা অপারেশন নিষিদ্ধ। এবং এটা অবশ্যই ধারণ করে না boolগুলি

অতএব, যদি আপনার vectorকোনও ধারক থেকে সত্যিকারের আচরণের প্রয়োজন হয় তবে আপনি এটিটি থেকে boolপাবেন না std::vector<bool>। সুতরাং আপনি একটি দিয়ে দিতে হবে std::deque<bool>

অনুসন্ধানের

আপনি একটি কন্টেইনারে উপাদান খুঁজে পেতে প্রয়োজন, এবং অনুসন্ধান ট্যাগ মাত্র একটি সূচক হতে পারে না, তাহলে আপনি পরিত্যাগ করার প্রয়োজন হতে পারে std::vectorপক্ষে setএবং map। মূল শব্দটি " মে " নোট করুন ; বাছাই std::vectorকরা কখনও কখনও যুক্তিসঙ্গত বিকল্প হয়। বা বুস্ট.কন্টেইনারগুলি flat_set/map, যা একটি সাজানো কার্যকর করে std::vector

এগুলির এখন চারটি ভিন্নতা রয়েছে যার প্রত্যেকটির নিজস্ব চাহিদা রয়েছে।

  • mapযখন অনুসন্ধান ট্যাগটি আপনি যে আইটেমটি নিজেরাই সন্ধান করছেন তেমন জিনিস নয় তখন ব্যবহার করুন । না হলে ব্যবহার করুন ক set
  • ব্যবহার করুন unorderedযখন আপনি একটি আছে অনেক কন্টেইনারে আইটেম এবং অনুসন্ধান করুন কর্মক্ষমতা একেবারে হওয়া প্রয়োজন O(1)বদলে O(logn)
  • multiএকই অনুসন্ধান ট্যাগ পেতে আপনার যদি একাধিক আইটেমের প্রয়োজন হয় তবে ব্যবহার করুন ।

ক্রমানুসার

আপনার যদি কোনও নির্দিষ্ট তুলনা ক্রিয়াকলাপের ভিত্তিতে আইটেমগুলির একটি ধারক সর্বদা বাছাই করার প্রয়োজন হয় তবে আপনি এ ব্যবহার করতে পারেন set। বা multi_setযদি আপনার একই মানটির জন্য একাধিক আইটেমের প্রয়োজন হয়।

বা আপনি বাছাই করা ব্যবহার করতে পারেন std::vectorতবে আপনাকে এটি বাছাই করে রাখতে হবে।

স্থায়িত্ব

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

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

যদি এটি খুব শক্তিশালী গ্যারান্টি থাকে তবে std::dequeএকটি দুর্বল তবে দরকারী গ্যারান্টি সরবরাহ করে। মাঝখানে সন্নিবেশ থেকে অবৈধকরণের ফলাফল, তবে মাথা বা লেজে সন্নিবেশগুলি কেবল পুনরাবৃত্তকারীদের অবৈধকরণের কারণ , পাত্রে আইটেমের পয়েন্টার / রেফারেন্স নয়।

সন্নিবেশ সম্পাদন

std::vector কেবল শেষে সস্তায় সন্নিবেশ সরবরাহ করে (এবং তারপরেও, আপনি সক্ষমতা ফুটিয়ে তুললে এটি ব্যয়বহুল হয়ে যায়)।

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

std::dequeমাথা এবং লেজে স্থির সময় সন্নিবেশ / অপসারণ সরবরাহ করে তবে মাঝখানে সন্নিবেশ মোটামুটি ব্যয়বহুল হতে পারে। সুতরাং আপনার যদি সামনে এবং পিছনের দিক থেকে জিনিসগুলি যুক্ত / সরানোর প্রয়োজন হয় তবে std::dequeআপনার যা প্রয়োজন তা হতে পারে।

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

কোনও গতিশীল বরাদ্দ নেই

std::arrayআপনি যদি সম্ভব সবচেয়ে কম গতিশীল বরাদ্দ চান তবে এটি একটি সূক্ষ্ম ধারক। এটি একটি সি-অ্যারের চারপাশে কেবল একটি মোড়ক; এর অর্থ হ'ল এটির আকার অবশ্যই সংকলন সময়ে জানা উচিত । আপনি যদি এটি নিয়ে বেঁচে থাকতে পারেন তবে ব্যবহার করুন std::array

যা বলা হচ্ছে , একটি আকার ব্যবহার std::vectorএবং reserveআইএনও করা একটি গণ্ডির জন্য ঠিক পাশাপাশি কাজ করবে std::vector। এইভাবে, প্রকৃত আকারটি পৃথক হতে পারে এবং আপনি কেবল একটি মেমরি বরাদ্দ পান (যদি না আপনি ক্ষমতাটি ফুটিয়ে তোলেন)।


1
ওয়েল, আমি আপনার উত্তরটিও খুব পছন্দ করি :) ডাব্লুআরটি একটি ভেক্টরকে বাছাই করে রাখা, এ ছাড়াও std::sortএমন কিছু রয়েছে std::inplace_mergeযা সহজেই নতুন উপাদানগুলি (একটি std::lower_bound+ std::vector::insertকলের পরিবর্তে ) সহজেই আকর্ষণীয় । ভালো লাগার কথা flat_setএবং flat_map!
ম্যাথিউ এম।

2
আপনি 16-বাইট সারিবদ্ধ প্রকারের সাথে কোনও ভেক্টর ব্যবহার করতে পারবেন না। এছাড়াও আরো একটি ভাল প্রতিস্থাপন জন্য vector<bool>হয় vector<char>
বিপরীতে

@ বিপরীত: "আপনি 16-বাইট প্রান্তিককৃত প্রকারের সাথে কোনও ভেক্টরও ব্যবহার করতে পারবেন না" " বল কে? যদি std::allocator<T>এই প্রান্তিককরণটিকে সমর্থন না করে (এবং কেন এটি হবে না আমি জানি না), তবে আপনি সর্বদা আপনার নিজস্ব কাস্টম বরাদ্দকারীকে ব্যবহার করতে পারেন।
নিকল বোলাস

2
@ বিপরীত: সি ++ 11 এর std::vector::resizeএকটি ওভারলোড রয়েছে যা কোনও মূল্য নেয় না (এটি কেবলমাত্র নতুন আকার নেয়; কোনও নতুন উপাদান স্থানে-স্থানে নির্ধারিত হবে)। এছাড়াও, সংকলকগণ কেন মান প্যারামিটারগুলি যথাযথভাবে সারিবদ্ধ করতে অক্ষম, এমনকি যখন তাদের সেই সারিবদ্ধকরণের ঘোষণা দেওয়া হয়?
নিকল বোলাস ২


25

উপরের ফ্লোচার্টের সি ++ 11 সংস্করণ এখানে। [মূলত এর মূল লেখক, মিকেল পারসনকে অ্যাট্রিবিউট ছাড়াই পোস্ট করা হয়েছে ]


2
@ নোবো বাহ, আমি খুশি যে কেউ কোনও উত্স উদ্ধৃত করার জন্য বিরক্ত করেছিল।
আন্ডারস্কোর_

1

এখানে একটি দ্রুত স্পিন, যদিও এটি সম্ভবত কাজের প্রয়োজন

Should the container let you manage the order of the elements?
Yes:
  Will the container contain always exactly the same number of elements? 
  Yes:
    Does the container need a fast move operator?
    Yes: std::vector
    No: std::array
  No:
    Do you absolutely need stable iterators? (be certain!)
    Yes: boost::stable_vector (as a last case fallback, std::list)
    No: 
      Do inserts happen only at the ends?
      Yes: std::deque
      No: std::vector
No: 
  Are keys associated with Values?
  Yes:
    Do the keys need to be sorted?
    Yes: 
      Are there more than one value per key?
      Yes: boost::flat_map (as a last case fallback, std::map)
      No: boost::flat_multimap (as a last case fallback, std::map)
    No:
      Are there more than one value per key?
      Yes: std::unordered_multimap
      No: std::unordered_map
  No:
    Are elements read then removed in a certain order?
    Yes:
      Order is:
      Ordered by element: std::priority_queue
      First in First out: std::queue
      First in Last out: std::stack
      Other: Custom based on std::vector????? 
    No:
      Should the elements be sorted by value?
      Yes: boost::flat_set
      No: std::vector

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

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