Форум программистов, компьютерный форум CyberForum.ru

Сортировка std::map по значению - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 48, средняя оценка - 4.77
stark91
1 / 1 / 0
Регистрация: 07.05.2010
Сообщений: 55
23.05.2012, 13:05     Сортировка std::map по значению #1
имеется вот такой вот тип:
C++
1
2
3
4
5
6
typedef struct
{
    char domain[LOG_SIZE_REFERER];
    set<uint32_t> unique_ip;
    set<uint32_t> unique_id;
} REF_LOG;

и map содержащий этот тип:
C++
1
2
map<unsigned short,REF_LOG> referers_map;
map<unsigned short,REF_LOG>::iterator ref_iter;
также функция сравнения для sort():
C++
1
2
3
4
inline bool RefCmp(REF_LOG param_1, REF_LOG param_2)
{
    return (param_1.unique_id.size() > param_2.unique_id.size());
};
при попытке сделать сортировку:
C++
1
sort(referers_map.begin(), referers_map.end(), RefCmp);
компилятор пишет много-много ошибок, я так понял что эта функция не работает на ассоциативные контейнеры.
Подскажите пожалуйста как можно отсортировать std::map по полю Value.
Заранее благодарен.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.05.2012, 13:13     Сортировка std::map по значению #2
Цитата Сообщение от stark91 Посмотреть сообщение
как можно отсортировать std::map по полю Value.
никак
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
23.05.2012, 13:14     Сортировка std::map по значению #3
Цитата Сообщение от stark91 Посмотреть сообщение
я так понял что эта функция не работает на ассоциативные контейнеры.
Естественно. Ну и еще есть такой факт, что map по умолчанию отсортирован по ключу.

Цитата Сообщение от stark91 Посмотреть сообщение
Подскажите пожалуйста как можно отсортировать std::map по полю Value.
Вы имеете в виду сортировку по значениям, а не по ключу?
Тогда здесь два выхода - использовать двунаправленные мапы, к примеру, из boost'a, либо сделать массив pair'ов и сортировать уже его.
stark91
1 / 1 / 0
Регистрация: 07.05.2010
Сообщений: 55
23.05.2012, 13:20  [ТС]     Сортировка std::map по значению #4
а при помощи map::swap() можно такое реализовать?

Добавлено через 1 минуту
Цитата Сообщение от diagon Посмотреть сообщение
Тогда здесь два выхода - использовать двунаправленные мапы, к примеру, из boost'a, либо сделать массив pair'ов и сортировать уже его.
А можно пожалуйста по подробнее про все это?
Петррр
 Аватар для Петррр
5914 / 3351 / 333
Регистрация: 28.10.2010
Сообщений: 5,926
23.05.2012, 13:24     Сортировка std::map по значению #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <array>
#include <algorithm>
 
bool cmp(const std::pair<int, int>& first, 
         const std::pair<int, int>& second)
{
    return first.second < second.second;
}
 
int main()
{
    std::array<std::pair<int, int>, 3> arr;
    arr[0] = std::pair<int, int>(1, 3);
    arr[1] = std::pair<int, int>(2, 2);
    arr[2] = std::pair<int, int>(3, 1);
    for(auto it = arr.begin(); it != arr.end(); ++it)
        std::cout << it->first << ": " << it->second << std::endl;
    std::sort(arr.begin(), arr.end(), cmp);
    std::cout << std::endl;
    for(auto it = arr.begin(); it != arr.end(); ++it)
        std::cout << it->first << ": " << it->second << std::endl;
    system("pause");
    return 0;
}
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
23.05.2012, 13:30     Сортировка std::map по значению #6
Цитата Сообщение от stark91 Посмотреть сообщение
а при помощи map::swap() можно такое реализовать?
А причем тут swap?

Цитата Сообщение от stark91 Посмотреть сообщение
А можно пожалуйста по подробнее про все это?
Пример с созданием и последующей сортировкой массива
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <utility>
 
bool pred(const std::pair< int, int > &a, const std::pair< int, int > &b)
{
    return a.second < b.second;
}
 
int main()
{
    std::map< int, int > map;
    map[1] = 100500;
    map[2] = 404;
    map[3] = 666;
    
    //создаем вектор из map'a
    std::vector< std::pair< int, int > > vec(map.begin(), map.end() );
    //сортируем этот вектор по значению
    std::sort(vec.begin(), vec.end(), pred);
    //вывод 
    for (auto p : vec) //цикл в стиле c++11
        std::cout << p.first << ' ' << p.second << std::endl;
}
Что касается двунаправленных мапов - долго объяснять, да и зачем, если есть документация.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2012, 13:41     Сортировка std::map по значению
Еще ссылки по теме:

Сортировка map по значению C++
C++ Размерность std::map
C++ Сортировка map по значению int в порядке убывания и частично по ключу char :)

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
stark91
1 / 1 / 0
Регистрация: 07.05.2010
Сообщений: 55
23.05.2012, 13:41  [ТС]     Сортировка std::map по значению #7
спасибо большое за инфу, буду разбираться
Yandex
Объявления
23.05.2012, 13:41     Сортировка std::map по значению
Ответ Создать тему
Опции темы

Текущее время: 01:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru