2009-12-14 36 views
7

Tôi đã đoạn mã sau:C++ bản đồ băm riêng giữ gìn trật tự chèn

#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; 
} 

Tuy nhiên, tôi đang tìm kiếm cái gì đó giữ gìn trật tự để sau này tôi có thể lặp qua các yếu tố theo thứ tự trong đó chúng được chèn vào. Trên máy tính của tôi mã trên không giữ gìn trật tự, và in như sau:

0 1 
11 0 
21 2 

Tôi nghĩ có lẽ tôi có thể sử dụng một boost::multi_index_container

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

ai đó có thể chỉ cho tôi làm thế nào để thực hiện mã ban đầu của tôi sử dụng vùng chứa này (hoặc bất kỳ vùng chứa thích hợp nào khác) để trình vòng lặp theo thứ tự chèn?

+1

Đang duy trì một danh sách riêng biệt để theo dõi thứ tự chèn ra khỏi câu hỏi? – Qberticus

Trả lời

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

Cảm ơn. Tôi nhận được một lỗi biên dịch với mã trên trên tăng 1,41. – dzhelil

+0

Tôi đã thử nghiệm ví dụ này với Boost.1.41 và Visual Studio 2005 và mọi thứ đều OK. Bạn sử dụng trình biên dịch và hệ điều hành nào? –

+0

Tôi đang sử dụng i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. xây dựng 5646) (dấu chấm 1) trên Snow Leopard. Tôi đang tải xuống gcc-4.4 ngay bây giờ, hy vọng nó sẽ biên dịch với phiên bản gcc mới nhất. – dzhelil

2

Bạn có thể thử tạo bản đồ đã đặt hàng bằng cách sử dụng kết hợp bản đồ và vectơ.

  • Vector có thể giữ cặp khóa và giá trị .
  • Trình lặp vòng lặp Vector có thể được sử dụng làm công cụ lặp để duyệt qua bản đồ đã sắp xếp.
  • bản đồ có thể được sử dụng truy cập các thành phần nhanh hơn.
+0

Tôi không có kinh nghiệm trong C++. Bạn có thể cho tôi triển khai mẫu đề xuất của bạn không? – dzhelil

Các vấn đề liên quan