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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 48, средняя оценка - 4.77
stark91
1 / 1 / 0
Регистрация: 07.05.2010
Сообщений: 55
#1

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

23.05.2012, 13:05. Просмотров 7161. Ответов 6
Метки нет (Все метки)

имеется вот такой вот тип:
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.
Заранее благодарен.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2012, 13:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сортировка std::map по значению (C++):

Возможно ли создать контейнер std::map, в котором в качестве значения была бы ссылка на std::map? - C++
Здравствуйте. Возможно ли создать контейнер std::map, в котором в качестве значения была бы ссылка на std map? Например: std::map...

Emplace в std::map. Как добавить элемент в std::map без копирования? - C++
здравствуйте... есть ли способ не писать так: std::map&lt;int, char&gt; ksa; ksa.emplace(std::piecewise_construct, ...

Сортировка map по значению - C++
Добрый день:) Как можно отсортировать map по возрастанию/убыванию float(неважно ключ это или значение) Программа- частотный анализ...

Сортировка map по значению - C++
Здорова господа!!! Есть массив: map&lt;string, int&gt; m; m=3; m=2; m=10; Нужно найти максимальный элемент массива? Пытаюсь...

Сортировка map по значению - C++
Есть некий map: map&lt;string, int&gt; MyMap; Нужно вывести на экран всё содержимое контейнера в порядке наибольшего значения. После...

Сортировка map по значению (c заковыкой) - C++
А вот и она. Значение это класс: class Info { public: Info (string _address, string _number); string getAddress(); ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.05.2012, 13:13 #2
Цитата Сообщение от stark91 Посмотреть сообщение
как можно отсортировать std::map по полю Value.
никак
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
23.05.2012, 13:14 #3
Цитата Сообщение от stark91 Посмотреть сообщение
я так понял что эта функция не работает на ассоциативные контейнеры.
Естественно. Ну и еще есть такой факт, что map по умолчанию отсортирован по ключу.

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

Добавлено через 1 минуту
Цитата Сообщение от diagon Посмотреть сообщение
Тогда здесь два выхода - использовать двунаправленные мапы, к примеру, из boost'a, либо сделать массив pair'ов и сортировать уже его.
А можно пожалуйста по подробнее про все это?
Петррр
5949 / 3386 / 337
Регистрация: 28.10.2010
Сообщений: 5,926
23.05.2012, 13:24 #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
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
23.05.2012, 13:30 #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;
}
Что касается двунаправленных мапов - долго объяснять, да и зачем, если есть документация.
stark91
1 / 1 / 0
Регистрация: 07.05.2010
Сообщений: 55
23.05.2012, 13:41  [ТС] #7
спасибо большое за инфу, буду разбираться
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2012, 13:41
Привет! Вот еще темы с ответами:

Сортировка map по значению int в порядке убывания и частично по ключу char :) - C++
Добрый день. Помогите, пожалуйста, отсортировать std::map &lt;char, int&gt; a. Например, у меня есть такие элементы: 5 5 3 8 ...

Стоит ли очищать в деструкторе std::map , std::vecotor? - C++
У меня ещё один нубский вопрос :) Вот если в классе объявлены мапы и вектора, которые по ходу программы как то заполняются, нужно ли мне...

std::map, std::vector и порядок обхода коллекции - C++
Здравствуйте, уважаемые! Вопрос следующий - если я сохраняю какие-то значения в map или вектор, то всегда ли я буду получать тот-же...

Как искать по std::vecotr из std::pait по одному значению из пары? - C++
? :) Пункт 4.7 Правил: Как можно более полно описывайте суть проблемы или вопроса, что было сделано для ее решения и какие результаты...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.05.2012, 13:41
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru