خريطة تجزئة C ++ التي تحافظ على ترتيب الإدراج [مكررة

StackOverflow https://stackoverflow.com/questions/1899564

سؤال

هذا السؤال لديه بالفعل إجابة هنا:

لدي الكود التالي:

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

هل يمكن لأي شخص ما أن يرني كيفية تطبيق الرمز الأصلي باستخدام هذه الحاوية (أو أي حاوية أخرى مناسبة) بحيث يتبع المؤيد ترتيب الإدراج؟

هل كانت مفيدة؟

المحلول

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

نصائح أخرى

يمكنك تجربة إنشاء خريطة أمر باستخدام مزيج الخريطة والمتجه.

  • يمكن أن يحمل ناقل زوجا من المفتاح والقيمة.
  • يمكن استخدام مطهر المتجهات كمقاولات لاجتياز خريطة أمر.
  • يمكن استخدام الخريطة الوصول إلى العناصر بشكل أسرع.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top