2009-12-14 14 views
7

मैं निम्नलिखित कोड है के आदेश को बरकरार रखता है: इसी क्रम ताकि बाद में मैं एक ही क्रम में तत्वों से अधिक पुनरावृति कर सकते हैं बरकरार रखता हैएक सी ++ हैश मैप कि प्रविष्टि

#include <iostream> 
#include "boost/unordered_map.hpp" 

using namespace std; 
using namespace boost; 

int main() 
{ 

    typedef unordered_map<int, int> Map; 
    typedef Map::const_iterator It; 

    Map m; 
    m[11] = 0; 
    m[0] = 1; 
    m[21] = 2; 

    for (It it (m.begin()); it!=m.end(); ++it) 
     cout << it->first << " " << it->second << endl; 

    return 0; 
} 

हालांकि, मैं कुछ देख रहा हूँ जिसमें वे डाले गए थे। अपने कंप्यूटर पर उपरोक्त कोड क्रम बनाए रखने के नहीं है, और प्रिंट निम्नलिखित:

0 1 
11 0 
21 2 

मैं शायद सोचा था कि मैं एक boost::multi_index_container

typedef multi_index_container< 
    int, 
    indexed_by< 
     hashed_unique<identity<int> >, 
     sequenced<> 
    > 
> Map; 

किसी ने मुझसे बताएंगे कि कैसे कर सकते हैं का उपयोग कर अपने मूल कोड लागू करने के लिए इस्तेमाल कर सकते हैं यह कंटेनर (या कोई अन्य उचित कंटेनर) ताकि इटरेटर सम्मिलन के क्रम का पालन करता हो?

+1

प्रश्न से बाहर सम्मिलन आदेश को ट्रैक करने के लिए एक अलग सूची बनाए रख रहा है? – Qberticus

उत्तर

11
#include <iostream> 
#include "boost/unordered_map.hpp" 

#include <boost/multi_index_container.hpp> 
#include <boost/multi_index/member.hpp> 
#include <boost/multi_index/ordered_index.hpp> 
#include <boost/multi_index/hashed_index.hpp> 
#include <boost/multi_index/sequenced_index.hpp> 

using namespace std; 
using namespace boost; 
using namespace boost::multi_index; 


struct key_seq{}; 
struct key{}; 

struct Data_t 
{ 
    int key_; 
    int data_; 
    Data_t (int key_v, int data_v) : key_(key_v), data_(data_v) {} 
}; 

int main() 
{ 
    typedef multi_index_container< 
     Data_t, 
     indexed_by< 
      hashed_unique<tag<key>, BOOST_MULTI_INDEX_MEMBER(Data_t,int,key_)>, 
      sequenced<tag<key_seq> > 
     > 
    > Map; 

    typedef Map::const_iterator It; 

    typedef index<Map,key>::type Map_hashed_by_key_index_t; 
    typedef index<Map,key>::type::const_iterator Map_hashed_by_key_iterator_t; 

    typedef index<Map,key_seq>::type Map_sequenced_by_key_index_t; 
    typedef index<Map,key_seq>::type::const_iterator Map_sequenced_by_key_iterator_t; 

    Map m; 
    m.insert(Data_t(11,0)); 
    m.insert(Data_t(0,1)); 
    m.insert(Data_t(21,1)); 

    { 
     cout << "Hashed values\n"; 
     Map_hashed_by_key_iterator_t i = get<key>(m).begin(); 
     Map_hashed_by_key_iterator_t end = get<key>(m).end(); 
     for (;i != end; ++i) { 
      cout << (*i).key_ << " " << (*i).data_ << endl; 
     } 
    } 

    { 
     cout << "Sequenced values\n"; 
     Map_sequenced_by_key_iterator_t i = get<key_seq>(m).begin(); 
     Map_sequenced_by_key_iterator_t end = get<key_seq>(m).end(); 
     for (;i != end; ++i) { 
      cout << (*i).key_ << " " << (*i).data_ << endl; 
     } 
    } 

    return 0; 
} 
+0

धन्यवाद। मुझे 1.41 को बढ़ावा देने के लिए उपरोक्त कोड के साथ संकलन त्रुटि मिलती है। – dzhelil

+0

मैंने बूस्ट .1.41 और विजुअल स्टूडियो 2005 के साथ इस उदाहरण का परीक्षण किया है और सबकुछ ठीक है। आप किस कंपाइलर और ओएस का उपयोग करते हैं? –

+0

मैं हिम तेंदुए पर i686-apple-darwin10-gcc-4.2.1 (जीसीसी) 4.2.1 (ऐप्पल इंक। 5646) (डॉट 1) का उपयोग कर रहा हूं। मैं अभी जीसीसी-4.4 डाउनलोड कर रहा हूं, उम्मीद है कि यह जीसीसी के नवीनतम संस्करण के साथ संकलित होगा। – dzhelil

2

आप मानचित्र और वेक्टर के संयोजन का उपयोग करके आदेशित नक्शा बनाने का प्रयास कर सकते हैं।

  • वेक्टर कुंजी की जोड़ी और मान रख सकता है।
  • वेक्टर इटरेटर का उपयोग इटरेटर के रूप में किया जा सकता है ताकि ऑर्डर करने वाले मानचित्र को पार किया जा सके।
  • मानचित्र का उपयोग तेजी से तत्वों तक पहुंचने के लिए किया जा सकता है।
+0

मैं सी ++ में बहुत अनुभवी नहीं हूं। क्या आप मुझे अपने सुझाव का एक नमूना कार्यान्वयन दे सकते हैं? – dzhelil

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