использование boost multi_index_container для сохранения порядка вставки - PullRequest
5 голосов
/ 13 июля 2010

Сначала я использовал std::multimap для хранения многих значений с одним и тем же ключом, но потом обнаружил, что он не сохраняет порядок вставки среди значений с одним и тем же ключом. Этот ответ утверждает, что это можно сделать с помощью boost::multi_index::multi_index_container, но не приводит никаких примеров.Просматривая документы, нет примеров такого использования, и я не могу понять, как вы должны использовать эту вещь.Я ожидал плохую документацию от менее используемых библиотек наддува, но это не так.Может кто-нибудь указать мне на учебник или пример, который показывает, что он использовал, как я хочу, или, возможно, даже привести пример сами?

Ответы [ 2 ]

6 голосов
/ 14 июля 2010

Этого можно добиться, используя boost::multi_index с двумя индексами: ordered_non_unique (который допускает значения с одним и тем же ключом) и random_access (который сохранит порядок вставки).

struct some {
  long key;
  int data;
  int more_data;
  // etc.  
};

typedef multi_index_container<
  some, 
  indexed_by<    
    random_access<>,  // keep insertion order
    ordered_non_unique< member<some, long, &some::key> >
  > 
> some_mic_t;
0 голосов
/ 14 июля 2010

Как насчет

map<int, vector<string> >

или

map<int, list<string> >

@ Кирилл: Хороший ответ. Я подозреваю, что Boost's random_access может быть довольно медленным, так как он заставит все строки для всех ключей поддерживаться в единой непрерывной структуре. Тогда как спрашивающий просто хочет, чтобы порядок был сохранен в наборе сопоставленных значений каждого ключа.

...