Множественный порядок одинаковых ключей в VC++

Вопрос о том, сохраняет ли мультикарта порядок вставки идентичных ключей, задавался много раз, и я думаю, довольно ясно, что стандарт говорит, что это не так. Хотя, по-видимому, C++0x какое-то время говорил, что да, а потом опять нет?

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

Итак, поддерживает ли VC++ порядок вставки идентичных ключей для мультикарт? (Или где бы я искал реализацию Microsoft, потому что я не мог ее найти?) Если это не так, что является лучшей альтернативой? повысить::мультииндекс?

Что, если бы я вместо того, чтобы просто вставлять без позиции, всегда сначала искал нужную позицию и передал последний элемент для идентичного ключа в качестве предложения позиции (например, использовать второй итератор equal_range)? Возможно, это сработает (меня волнуют только g++ и компилятор Windows). Я бы предположил, что это может сравниться с этим элементом, затем со следующим, затем быть счастливым и вставить? Или не может, поскольку древовидная структура может означать, что на самом деле он может не выполнять волшебное переключение листьев для идентичных ключей, и если не тот дочерний элемент свободен, вставьте его туда?

Кстати, я никогда не понимаю ответов, которые предлагают использовать две структуры. Конечно, это делает удаления довольно дорогими?


person Cookie    schedule 16.07.2011    source источник
comment
В окончательном варианте говорится, что порядок эквивалентных элементов должен быть сохранен. Не знаю, какие версии компилятора это подобрали.   -  person Bo Persson    schedule 17.07.2011
comment
Просто используйте map<vector>, как сказал @Sjoerd, или map<list>, если вам нужно удалить определенные значения в одном ключе.   -  person tomasz    schedule 17.07.2011


Ответы (2)


std::map<std::vector<T> > отвечает всем вашим требованиям.

person Sjoerd    schedule 16.07.2011

Вы можете использовать составные ключи. Просто используйте lower_bound для поиска. Не уверен, что это решит вашу основную проблему.

person RocketR    schedule 16.07.2011