सेट का उपयोग करें जब:
- हमें ऑर्डर किए गए डेटा (अलग-अलग तत्व) चाहिए।
- हमें डेटा (छांटे गए क्रम में) को प्रिंट / एक्सेस करना होगा।
- हमें तत्वों के पूर्ववर्ती / उत्तराधिकारी की आवश्यकता है।
जब unordered_set का उपयोग करें:
- हमें अलग-अलग तत्वों का एक सेट रखने की आवश्यकता है और कोई आदेश देने की आवश्यकता नहीं है।
- हमें सिंगल एलिमेंट एक्सेस की आवश्यकता है यानी कोई ट्रैवर्सल नहीं।
उदाहरण:
सेट:
इनपुट: १,,, २, ५, ३, ९
आउटपुट: 1, 2, 3, 5, 8, 9
Unordered_set:
इनपुट: १,,, २, ५, ३, ९
आउटपुट: ९ ३ १ 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