সেটটি ব্যবহার করুন যখন:
- আমাদের অর্ডার করা ডেটা (স্বতন্ত্র উপাদান) প্রয়োজন।
- আমাদের ডেটা মুদ্রণ / অ্যাক্সেস করতে হবে (সাজানো ক্রমে)।
- আমাদের পূর্বসূরি / উপাদানগুলির উত্তরসূরি প্রয়োজন।
আনর্ডারড_সেট ব্যবহার করুন যখন:
- আমাদের স্বতন্ত্র উপাদানগুলির একটি সেট রাখতে হবে এবং কোনও অর্ডারের প্রয়োজন নেই।
- আমাদের একক উপাদান অ্যাক্সেস প্রয়োজন অর্থাত্ কোনও ট্র্যাভারসাল নেই।
উদাহরণ:
সেট:
ইনপুট: 1, 8, 2, 5, 3, 9
আউটপুট: 1, 2, 3, 5, 8, 9
Unordered_set:
ইনপুট: 1, 8, 2, 5, 3, 9
আউটপুট: 9 3 1 8 2 5 (সম্ভবত এই আদেশ, হ্যাশ ফাংশন দ্বারা প্রভাবিত)
মূলত পার্থক্য:
দ্রষ্টব্য: (কিছু ক্ষেত্রে set
আরও সুবিধাজনক) উদাহরণ vector
হিসাবে কী হিসাবে ব্যবহার করুন
set<vector<int>> s;
s.insert({1, 2});
s.insert({1, 3});
s.insert({1, 2});
for(const auto& vec:s)
cout<<vec<<endl; // I have override << for vector
// 1 2
// 1 3
কারণ vector<int>
কী হিসাবে হতে পারে set
কারণ vector
ওভাররাইড operator<
।
তবে আপনি যদি ব্যবহার করেন তবে আপনাকে এর unordered_set<vector<int>>
জন্য একটি হ্যাশ ফাংশন তৈরি করতে হবে vector<int>
, কারণ ভেক্টরটির একটি হ্যাশ ফাংশন নেই, সুতরাং আপনাকে এটির মতো একটি সংজ্ঞা দিতে হবে:
struct VectorHash {
size_t operator()(const std::vector<int>& v) const {
std::hash<int> hasher;
size_t seed = 0;
for (int i : v) {
seed ^= hasher(i) + 0x9e3779b9 + (seed<<6) + (seed>>2);
}
return seed;
}
};
vector<vector<int>> two(){
//unordered_set<vector<int>> s; // error vector<int> doesn't have hash function
unordered_set<vector<int>, VectorHash> s;
s.insert({1, 2});
s.insert({1, 3});
s.insert({1, 2});
for(const auto& vec:s)
cout<<vec<<endl;
// 1 2
// 1 3
}
আপনি দেখতে পাচ্ছেন যে কোনও ক্ষেত্রে unordered_set
এটি আরও জটিল।
প্রধানত এর থেকে উদ্ধৃত:
https://www.geeksforgeeks.org/set-vs-unordered_set-c-stl/
https://stackoverflow.com/a/29855973/6329006