2012-01-29 3 views
0

У меня есть map<std::string, myStruct> Интересно, как сортировать элементы на карте по свойству int, которое находится в myStruct.order, и если 2 или более из myStruct заказов - это тот же самый список бросков ключей (строк), которые делают карту несортируемой этим полем myStruct? Есть ли какой-нибудь причудливый способ сделать в C++ 03 (может быть с boost)?Как сортировать массивную карту по одной ценности?

+0

http://www.cplusplus.com/reference/algorithm/sort/ это не помогает? – Vyktor

+0

Поверните карту и сделайте ее «map », и вы получите это поведение бесплатно (при условии, что вы оснастите свой класс оператором сравнения). –

ответ

0

Вы не можете сделать это, используя std::map - first в pair используются для сравнения (это называется ключ). В вашем случае std::string является ключом .

Вы можете использовать std::set< std::pair< std::string, MyStruct > >, а затем осуществить operator< для двух std::pair< std::string, MyStruct >-s.

Или вы можете изменить определение std::map, если это возможно/разрешено/подходит/и т.д. Это действительно зависит от того, что вы пытаетесь сделать и что вам разрешено делать.

Или какой-либо другой контейнер (который держит порядок элементов, как размещено - как std::list, std::vector и т.д.), а затем с помощью std::sort или sort метод контейнера, если он существует.

0

Что означает «сортировка» карты? Конечно, карта может быть внутренне организована как BST или что-то сделать доступ быстрее, но концептуально элементы карты не имеют особого порядка.

Кроме этого, вы можете указать способ заказа ключей (потому что даже если вы организуете карту определенным образом, это по порядку ключей, а не по значению), но не для значений с третьим аргументом шаблона для карты.

+0

Это неверно, std :: map * по определению * сортированная структура данных, даже концептуально. Примером концептуально несортированной карты является std :: unordered_map. – wjl

0

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

Там один в толчок:

http://www.boost.org/doc/libs/1_48_0/libs/bimap/doc/html/index.html

Там пример здесь

http://www.boost.org/doc/libs/1_48_0/libs/bimap/doc/html/boost_bimap/examples/simple_bimap.html

1

импульс имеет полную (и сложные) функциональные возможности в MultiIndex, но если я правильно понимаю ваши требования, в этом случае это перебор. Достаточно простым способом было бы составить список указателей на myStruct и отсортировать. Тогда вы можете легко проверить дубликаты ключей (они стали смежными).

рода следует использовать функтор типа less<const myStruct*>, т.е.

bool compare_orders(const myStruct* a, const myStruct* b) { return a->order < b->order; } 
Смежные вопросы