карта хеша C++, которая сохраняет порядок вставки [дубликат]

Да, это аппаратно-зависимо (Вы вряд ли будете видеть проблему без нескольких процессоров), но это является также зависящим от реализации. Спецификации модели памяти в спецификации CLR разрешают вещи, которые реализацию Microsoft CLR не обязательно делают. Лучшая документация, которую я видел на энергозависимом ключевом слове, это сообщение в блоге Joe Duffy . Обратите внимание, что он говорит, что документация MSDN является "очень вводящей в заблуждение".

7
задан dzhelil 14 December 2009 в 08:02
поделиться

2 ответа

#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;
}
11
ответ дан 6 December 2019 в 19:37
поделиться

Вы можете попробовать создать упорядоченную карту, используя комбинацию карты и вектора.

  • Вектор может содержать пару ключей и значение.
  • Векторный итератор может использоваться как итератор для обхода упорядоченной карты.
  • карта может использоваться для доступа к элементам быстрее.
2
ответ дан 6 December 2019 в 19:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: