2010-11-16 18 views
8

के साथ वेक्टर और हैश तालिका को बदलें, मैं vector<string> और boost::unordered_map<string, size_t> मैपिंग स्ट्रिंग को boost::bimap के साथ पूर्व में सूचकांक को प्रतिस्थापित करने के लिए देख रहा हूं।Boost.Bimap

bimap का क्या तत्काल उपयोग करना चाहिए? अब तक, मैं

typedef bimap< 
    unordered_set_of<size_t>, 
    vector_of<string> 
> StringMap; 

के साथ आया हूं, लेकिन मुझे यकीन नहीं है कि मैंने अब संग्रह प्रकारों को उलट दिया है या नहीं। साथ ही, मुझे आश्चर्य है कि मुझे collection of relations type बदलना चाहिए। क्या vector_of_relation मेरी सबसे अच्छी पसंद होगी, या set_of_relation, या सिर्फ डिफ़ॉल्ट के साथ जाओ?

+1

जिस तरीके से आप डेटा का उपयोग करने की योजना बना रहे हैं, उसके बारे में कुछ और जानकारी जोड़ें ताकि हम आपको जो चाहिए उसे पूरा करने के लिए बाधाओं को निर्धारित कर सकें। –

+0

मैं दोनों (न्यूनतम) और न्यूनतम या मामूली स्मृति आवश्यकताओं के लिए ओ (1) एक्सेस समय के साथ 'size_t' और' string' ऑब्जेक्ट्स के बीच एक विभाजन चाहता था। –

+0

क्या आपके तार सभी अद्वितीय हैं? –

उत्तर

4

size_t और एसटीडी के बीच एक bimap :: स्ट्रिंग आप जहां प्राप्त करने के लिए ~ निरंतर आप unordered_set_of उपयोग करने की आवश्यकता (हैशिंग की लागत और किसी भी संभावित संघर्ष करने के लिए):

#include <boost/bimap.hpp> 
#include <boost/bimap/unordered_set_of.hpp> 
#include <string> 
#include <iostream> 
#include <typeinfo> 

int main(int argc, char* argv[]) { 

    typedef boost::bimap< boost::bimaps::unordered_set_of<size_t>, boost::bimaps::unordered_set_of<std::string> > StringMap; 
    StringMap map; 
    map.insert(StringMap::value_type(1,std::string("Cheese"))); 
    map.insert(StringMap::value_type(2,std::string("Cheese2"))); 

    typedef StringMap::left_map::const_iterator const_iter_type; 
    const const_iter_type end = map.left.end(); 

    for (const_iter_type iter = map.left.begin(); iter != end; iter++) { 
    std::cout << iter->first << " " << map.left.at(iter->first) << "\n"; 
    } 

} 

रिटर्न:

1 Cheese 
2 Cheese2 

unordered_set जो पेड़ों के बजाय हैश तालिकाओं का उपयोग करता तत्वों स्टोर करने के लिए सेट की एक बढ़ावा संस्करण है, Boost Unordered docs देखते हैं।

Bimap example पर bimap उदाहरणों में से एक से टिप्पणी को देखते हुए, हमने:

बाईं मानचित्र दृश्य एक std :: unordered_map < std :: स्ट्रिंग, लंबे>, नाम दिया तरह काम करता है देश का हम निरंतर समय में जनसंख्या की खोज के लिए इसका उपयोग कर सकते हैं

+0

लेकिन क्या यह मुझे 'size_t' पक्ष के लिए ओ (1) एक्सेस समय और दूसरी ओर से "हेड ओ (1)" देता है? –

+0

नहीं, यह नहीं होगा। हालांकि उम्मीद है कि यह मेरे हालिया संपादन के साथ सही है। मुझे संदेह है कि या तो एक्सेस (size_t या std :: string) इस तरह से सबसे खराब मामले में ओ (1) प्राप्त करें, लेकिन उन्हें ओ (1) औसत केस जटिलता मिलनी चाहिए। – MGwynne

+0

ठीक है, स्वीकार किया। मैं मल्टी इंडेक्स को बिमाप के किसी भी संभावित उपयोगकर्ताओं को सलाह दूंगा, हालांकि। –