Как отсортировать массивную карту по одному значению свойства? - PullRequest
0 голосов
/ 30 января 2012

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

Ответы [ 4 ]

1 голос
/ 30 января 2012

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

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

bool compare_orders(const myStruct* a, const myStruct* b) { return a->order < b->order; }
0 голосов
/ 30 января 2012

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

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

0 голосов
/ 30 января 2012

Я согласен с другими ответами, что не понятно, зачем вам нужно сортировать карту.Но вы можете использовать двунаправленную карту , чтобы вы могли просматривать и 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

0 голосов
/ 30 января 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...