C ++ словарь / карта с добавленным порядком - PullRequest
3 голосов
/ 31 марта 2010

Я хочу иметь что-то похожее на карту, но во время итерации я хочу, чтобы они были в том же порядке, в котором они были добавлены.

Пример

map.insert("one", 1);
map.insert("two", 2);
map.insert("three", 3);

Во время итерации я хочу, чтобы элементы были похожи на «один», «два», «три» .. По умолчанию карта не обеспечивает этот добавленный порядок. Как получить элементы карты, как я добавил? Я хочу сохранить порядок ввода.

Все, что с STL хорошо, или другие альтернативные предложения тоже хорошо.

Ответы [ 3 ]

6 голосов
/ 31 марта 2010

std :: карта, которая отслеживает порядок вставки? это дубликат (спасибо Нилу Баттерворту)

Вы можете использовать карту с отсортированной структурой, параллельной ей.

map<key, value>
vector<value*> //holds only pointers to map entries.
vector<key> //holds only map keys. Adds one indirection.
4 голосов
/ 31 марта 2010

Boost mult iindex позволяет иметь контейнер, который можно повторять в нескольких разных порядках.

http://www.boost.org/doc/libs/1_42_0/libs/multi_index/doc/index.html

Слегка измененный пример:

struct record {
    int         insertion_index;
    std::string somestring;
    int         somevalue;
    bool operator < (const record& e) const {return insertion_index < e.insertion_index;}
};

typedef multi_index_container<
    record,
    indexed_by<
        // sort by record::operator<
        ordered_unique<insertion_indexentity<record> >,        
        // sort by less<string> on somestring
        ordered_non_unique<member<record,std::string,&record::somestring> >    
    >
> record_set;
2 голосов
/ 31 марта 2010

На самом деле std::map по умолчанию сортирует ваши ключи, используя std::less<T>, где T - это тип вашего ключа. Если вы не хотите, чтобы элементы сортировались по ключу, вы должны использовать std::list<std::pair<K,V> > или std::vector<std::pair<K,V> > - где K - ваш тип ключа, а V - ваш тип значения, а затем использовать * 1008. * добавить элементы в конец списка / вектора.

...