2012-01-19 10 views
6

के साथ हैश तालिका कंटेनर के std, boost या अन्य व्यापक कार्यान्वयन यदि मैं इसे सही ढंग से समझता हूं, तो std :: map और std :: unordered_map स्टोर कुंजी दोनों स्पष्ट रूप से (कुंजी/मानों के स्टोर जोड़े)। क्या कंटेनर (एसडीडी, बूस्ट या अन्य व्यापक कार्यान्वयन) का उपयोग करने के लिए कुछ और तैयार है जो कुंजी को स्टोर नहीं करेगा, बल्कि किसी फ़ंक्शन का उपयोग करके संग्रहीत मूल्य से कुंजी प्राप्त करने की अनुमति देता है (यानी अंतर्निहित कुंजी का उपयोग करने के लिए?)।अंतर्निहित कुंजी

उत्तर

4

std::set या std::unordered_set, संग्रहीत मूल्य प्रकार के लिए उपयुक्त हैश और/या तुलना फ़ंक्शंस के साथ।

हालांकि, लुकअप संग्रहीत मूल्य प्रकार द्वारा किया जाएगा, कुंजी नहीं, इसलिए आपको एक कुंजी से एक अस्थायी वस्तु बनाने के लिए भी एक तरीका चाहिए।

+2

क्या यह आपको पूरी वस्तु की आवश्यकता के बजाय केवल एक कुंजी * के साथ लुकअप करने की अनुमति देता है? –

+0

@ आर। मार्टिन्होफर्नैंड्स: मुझे नहीं लगता; शायद मैंने सवाल को गलत समझा। लेकिन यह एक समझदार दृष्टिकोण हो सकता है, जब तक आप आसानी से एक कुंजी से एक अस्थायी वस्तु बना सकते हैं। –

+0

@ आर। मार्टिन्होफर्नैंड्स जो (मेरी समझ) एक अलग प्रश्न/आवश्यकता होगी। बॉक्स के बाहर, आप मुख्य पीढ़ी के लिए पर्याप्त जानकारी के साथ आंशिक वस्तु बना सकते हैं। फिर फिर से ज्यादातर गैर चरम मामलों में मैं आगे बढ़ता हूं और कुंजी को स्टोर करता हूं (स्मृति आजकल सस्ता है) –

0

सी ++ लाइब्रेरी में सभी आदेशित कंटेनर उदा। std::setकम तुलना टेम्पलेट विशेषता के लिए अनुमति दें, इसे दूसरे टेम्पलेट पैरामीटर के रूप में पास करें (my_less नीचे उदाहरण में)। । यदि आप ऐसा नहीं करते हैं, तो operator< एडीएल के माध्यम से देखा जाएगा और यदि पाया जाता है (यदि संकलन त्रुटि नहीं है); यह बहुत से मामलों के लिए उपयुक्त होना चाहिए।

आपकी खुद की विशेषता या operator< का उपयोग किसी सेट में संग्रहीत डेटा के अनुसार क्रम को परिभाषित करने के लिए किया जा सकता है। इस तुलना को करने के लिए कोई डेटा कॉपी नहीं किया गया है, कृपया ध्यान दें कि यह कॉन्स संदर्भ लेता है।

आप ढेर वस्तु बनाने के लिए नहीं करना चाहते हैं और इसके बजाय ढेर संकेत का उपयोग करना पसंद करते हैं, तो आपको स्पष्ट रूप से boost::shared_ptr मानक आदेश दिया कंटेनर में स्टोर करने और अपने कम तुलना विशेषता तदनुसार लिख सकते हैं। इस मामले में आप भी boost ptr containers

उदाहरण उपयोग करने पर विचार हो सकता है:

#include <boost/shared_ptr.hpp> 
#include <set> 
#include <iterator> 
#include <iostream> 

struct order_by_AB { int a; int b; int c; 
    order_by_AB(int a, int b, int c) : a(a), b(b), c(c) {} 
}; 

struct my_less 
{ 
    bool operator()(const boost::shared_ptr<order_by_AB>& lh, const boost::shared_ptr<order_by_AB>& rh) 
    { 
    if (lh->a == rh->a) 
     return lh->b < rh->b; 
    return lh->a < rh->a; 
    } 
}; 

std::ostream& operator<< (std::ostream& os, const boost::shared_ptr<order_by_AB>& rh) 
{ 
    os << "(" << rh->a << "," << rh->b << "," << rh->c << ")"; 
    return os; 
} 

int main() 
{ 
    std::set<boost::shared_ptr<order_by_AB>, my_less> data; 
    data.insert(boost::shared_ptr<order_by_AB>(new order_by_AB(0, 1, 2))); 
    data.insert(boost::shared_ptr<order_by_AB>(new order_by_AB(2, 3, 2))); 
    data.insert(boost::shared_ptr<order_by_AB>(new order_by_AB(0, 3, 2))); 
    data.insert(boost::shared_ptr<order_by_AB>(new order_by_AB(2, 1, 2))); 
    std::copy(data.begin(), data.end(), std::ostream_iterator<boost::shared_ptr<order_by_AB>>(std::cout, "\n")); 
    return 0; 
} 

संपादित तुलना के लिए उपयोगकर्ता द्वारा निर्दिष्ट functor का उदाहरण देते हैं। संपादित एक कंटेनर

+0

जैसा कि मैंने किसी अन्य उत्तर पर बताया है, इसके साथ समस्या यह है कि आपको लुकअप करने के लिए एक पूर्ण वस्तु की आवश्यकता है। आप सिर्फ एक कुंजी के साथ एक लुकअप नहीं कर सकते, जैसे आप मानचित्र के साथ कर सकते हैं। –

+0

मुझे कुछ समझ में नहीं आता है। आप अपनी कुंजी से क्या प्राप्त करना चाहते हैं और इस व्युत्पन्न को कौन करना चाहिए? उपर्युक्त कोड संग्रहित मूल्य से कुंजी प्राप्त करता है। यदि आवश्यकता हो तो इसे प्रतिनिधि दिया जा सकता है, उदा। कंटेनर में संग्रहीत कक्षा के सदस्य समारोह के लिए। क्या आप वास्तव में मूल्य तक पहुंचने के बिना कुंजी प्राप्त करना चाहते हैं? यदि हां, तो महत्वपूर्ण मूल्य प्राप्त करने के लिए आवश्यक डेटा कहां होगा? – bronekk

+0

क्या आप 'डेटा [x] 'कर सकते हैं जहां' x' पूर्ण 'order_by_AB' ऑब्जेक्ट नहीं है? क्योंकि कभी-कभी एक पूर्ण वस्तु आना मुश्किल हो सकता है: कल्पना करें कि ऑब्जेक्ट में कुछ संसाधन है या नहीं। –

2

आप Boost.Intrusive की तलाश में हो सकता है में boost::shared_ptr जोड़ने के लिए। वस्तुओं से सीधे एक निश्चित कंटेनर (जैसे सेट, सूची, एवीएल पेड़, आदि) की विशेषताओं को प्रदान करने के लिए घुसपैठ वाले कंटेनर को अपने मूल्य प्रकारों में "हुक" करें।

एसटीएल कंटेनर और बूस्ट घुसपैठ कंटेनरों के बीच मतभेदों के अवलोकन के लिए Differences between intrusive and non-intrusive containers देखें।

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