2011-10-15 30 views
5

मेरे पास डेटा का एक सेट है जो कुछ अवसरों में मुझे उन्हें एक तरह से क्रमबद्ध करने और किसी अन्य अवसर पर कुछ अवसरों की आवश्यकता होती है। उदाहरण के लिए, मान लें कि डेटा सेट तारों का एक सेट है, {"abc", "dfg", ...}। कभी-कभी मुझे उन्हें वर्णमाला क्रम में और कभी-कभी उनकी लंबाई की तुलना करके क्रमबद्ध करने की आवश्यकता होती है।क्या सी ++ std :: सेट के तुलनित्र को बदलना संभव है?

प्रारंभ में मैंने अपने डेटा के कंटेनर के रूप में std :: set का उपयोग किया और 2 तुलनाकर्ताओं को लागू किया, उम्मीद है कि मैं फ्लाई पर सेट के तुलनित्र को बदल सकता हूं, क्योंकि डेटा बहुत बड़ा है और इसे कॉपी करने का अच्छा विचार नहीं है एक सेट से दूसरे में .. मैं समय-समय पर विभिन्न तुलनित्रों का उपयोग करके इसे सॉर्ट करना चाहता हूं। क्या यह संभव है या ऐसा करने का सही तरीका क्या है?

उत्तर

6

आपको निर्माण समय पर std::set के तुलनित्र को निर्दिष्ट करना होगा।

एक समाधान के रूप में, मैं इसके बजाय दो 'इंडेक्स' सेट बनाए रखता हूं, प्रत्येक वास्तविक संग्रह का जिक्र करता है। यह सबसे बड़ी लचीलापन पैदा करेगा। सब कुछ एक साथ रखने के लिए, मैं सुझाव है कि आप इसे एक एकल वर्ग में लपेट:

// to be compiled, debugged etc..., but ideal 
// to grab the idea 
// caveats: maintain the index objects whenever the collection 
// gets resized/reallocated etc... 
// so not to be written yourself, use an existing library :) 
template< typename T, typename comp1, typename comp2 > 
struct MultiIndex { 
    std::deque<T> collection; 
    std::set<T*, comp1> index1; 
    std::set<T*, comp2> index2; 

    void insert(const T& t){ 
     collection.push_back(t); 
     index1.insert(&collection.back()); 
     index2.insert(&collection.back()); 
    } 
}; 

बूस्ट पुस्तकालय इस तरह के एक वर्ग है: Multiindex

+0

धन्यवाद xtofl! वास्तव में मैं क्या चाहता हूँ। – blurrcat

2

सेट आंतरिक रूप से हमेशा क्रमबद्ध रखा जाता है (अन्यथा आपके पास आवश्यक प्रदर्शन नहीं होगा), इसलिए नहीं, तुलनित्र को बदला नहीं जा सकता है। मुझे लगता है कि यहां सबसे अच्छा समाधान एक ही डेटा के साथ दो सेट बनाए रखना है, लेकिन विभिन्न तुलनित्रों के साथ। मैं कक्षा में दो सेटों को समाहित करता हूं और दोनों सेटों पर डेटा समान होता है ताकि यह सुनिश्चित किया जा सके कि डेटा दोनों सेटों पर समान है।

यदि आपको केवल डेटा को हर समय क्रमबद्ध करने की आवश्यकता नहीं है, तो आप जो भी चाहते हैं उसे पूरा करने का एक और तरीका बस उपयोग करना होगा। आवश्यक होने पर आपको जो भी तुलनित्र चाहिए, उसके द्वारा वेक्टर और सॉर्ट करें।

1

नहीं, फ्लाई पर नहीं। पेड़ निर्माण समय पर निर्दिष्ट प्रकार के मानदंडों के आधार पर बनाया गया है। आप एक ही डेटासेट में एकाधिक इंडेक्स बनाने के बारे में बात कर रहे हैं, जो कई सेटों के साथ पूरा किया जा सकता है। शायद बूस्ट जैसे बहुत सारे libs हैं जिनके लिए पहले से ही कुछ बनाया गया है।

संबंधित मुद्दे