Сортировка карты по размеру - PullRequest
1 голос
/ 22 января 2011

У меня есть похожая карта:

map<int, map<int, map<int, int> > > myMap;

order-num | id | order-num-of-relation | relation-id
-----------------------------------------------------
    0     | 1  | 0                     | 2
-----------------------------------------------------
    1     | 2  | 0                     | 1
-----------------------------------------------------
          |    | 1                     | 3
-----------------------------------------------------
    2     | 3  | 0                     | 2
-----------------------------------------------------

1 (1), 2 (2), 3 (1)

, и мне нужно отсортировать (изменить "порядковый номер")) эта карта по размеру последней карты (порядковый номер отношения | ID-отношения).

Мне просто нужно сделать это:

order-num | id | order-num-of-relation | relation-id
-----------------------------------------------------
    0     | 1  | 0                     | 2
-----------------------------------------------------
    1     | 3  | 0                     | 2
-----------------------------------------------------
    2     | 2  | 0                     | 1
-----------------------------------------------------
          |    | 1                     | 3
-----------------------------------------------------

1 (1),3 (1), 2 (2)

Могу ли я использовать функцию «сортировки» и передать здесь собственную функцию сортировки (где я могу проверить размер и получить значение true / false), или мне нужно написать явную сортировкуалгоритм

Ответы [ 2 ]

2 голосов
/ 22 января 2011

То, что вы ищете, сделано в Boost с MultiIndex . Вот хороший учебник от Boost о том, как вы можете использовать его, чтобы решить, что вы запрашиваете при сборе данных, и о выборе примеров .

Конечно, использование этого объекта коллекции, вероятно, также изменит способ хранения информации. Вы будете размещать его в структуре. Однако, если вы хотите обрабатывать вашу информацию как базу данных с уникальным порядком по спецификации, это единственный способ, которым я знаю, как это чисто.

Другой вариант - создать свой собственный оператор заказа при размещении элементов в std :: map. Следовательно:

struct Orders{
    int order_num;
    int id;
    int order_num_relation;
    int relation_id;

    bool operator<(const Orders& _rhs){
       if(order_num < _rhs.order_num) return true;
       if(order_num == _rhs.order_num){
           if( id < _rhs.id) return true;
           if( id == _rhs.id){
              //and so on, and so on

Честно говоря, этот путь является болью и порождает очень легко игнорируемую логическую ошибку. Используя Boost, большинство «хитрых» вещей позаботятся о вас.

2 голосов
/ 22 января 2011

Вы не можете / не можете сортировать карты.Они автоматически сортируются по ключу на основе необязательного третьего параметра аргументов шаблона, который является классом объекта функции, который используется для сравнения двух элементов, чтобы определить, какой из них должен стоять первым.(он должен возвращать true, если первое должно предшествовать второму, иначе false)

Таким образом, вы можете использовать что-то вроде этого:

struct myCompare
{
    bool operator() const (const map<int,int> & lhs, const map<int,int> & rhs)
    {
        return lhs.size() < rhs.size();
    }
};

Но так как map<int,int> является вашим значением, ине ваш ключ, это не будет работать для вас.

...