Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / STL map сортировка по значению. / 6 сообщений из 6, страница 1 из 1
30.11.2015, 05:05
    #39115956
.NET
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
STL map сортировка по значению.
Как отсортировать map по значению?
Попробовал создать функциональный класс

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
template <class K, class T> struct pair_less_value
 : public binary_function<pair<K, T>, pair<K, T>, bool>
{
 bool operator () (pair<K, T> & p1, pair<K, T> & p2)
{
 return p1.second < p2.second;
}
}



Пытаюсь использовать этот класс в алгоритме sort.
Например так:
Код: plaintext
1.
2.
3.
map<string, int> m;
m["one"] = 1;
sort(m.begin(), m.end(), pair_less_value<string, int>());


Компилятор выдаёт ошибку, что итератор не реализует операцию "-".
...
Рейтинг: 0 / 0
30.11.2015, 06:21
    #39115962
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
STL map сортировка по значению.
.NET,

Это сделать нельзя.

Формально - потому что std::map не предоставляет итераторов произвольного доступа.
А по сути - потому что std::map - это дерево отсортированное по ключам, и никакие другие сортировки в нем невозможны.
...
Рейтинг: 0 / 0
30.11.2015, 06:45
    #39115964
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
STL map сортировка по значению.
Anatoly Moskovsky А по сути - потому что std::map - это дерево отсортированное по ключам, и никакие другие сортировки в нем невозможны.

по сути операция эта не имеет смысла по отношению к дереву построенному(а значит уже отсортированному) на множестве элементов по другому ключу. Дерево необходимо, как правило, когда вы преследуете две задачи: быстрый поиск, быстрое обновление. Автору раздела требуется сортировка по разным ключам. В таком случае пусть использует другие структуры, и быструю сортировку на них. Либо, в данном конкретном случае, нужно использовать временный буфер, в который выгружать все элементы дерева(провести обход дерева), и из данного буфера строить новое дерево
...
Рейтинг: 0 / 0
30.11.2015, 06:57
    #39115968
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
STL map сортировка по значению.
.NETКак отсортировать map по значению?

Никак. Перелить в вектор или список. Потом сортировать.
Если значения уникальны то можно перелить в map<int, string>

map это key-value хранилище, заточено под быстрый доступ к value по значению key. И всё.
...
Рейтинг: 0 / 0
30.11.2015, 10:50
    #39116103
YesSql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
STL map сортировка по значению.
.NETКак отсортировать map по значению?
Если требуется несколько разных "ключей доступа"/сортровок для своего типа то можно использовать один из boost::container для "мастера" и для остальных boost::intrusive
...
Рейтинг: 0 / 0
09.12.2015, 12:32
    #39124010
ДохтаР
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
STL map сортировка по значению.
.NETКак отсортировать map по значению?
Попробовал создать функциональный класс

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
template <class K, class T> struct pair_less_value
 : public binary_function<pair<K, T>, pair<K, T>, bool>
{
 bool operator () (pair<K, T> & p1, pair<K, T> & p2)
{
 return p1.second < p2.second;
}
}



Пытаюсь использовать этот класс в алгоритме sort.
Например так:
Код: plaintext
1.
2.
3.
map<string, int> m;
m["one"] = 1;
sort(m.begin(), m.end(), pair_less_value<string, int>());


Компилятор выдаёт ошибку, что итератор не реализует операцию "-".

Как ту выше было замечено, так сделать нельзя и не логично.
Это проблема проктирования.

Я когда Майтону предлагал это решение в рамках другой более сложной
задачи.
Чесно я тогда был в дипрессии и мне было лень,
сейчас на более простом примере могу обьяснить.

есть
Код: plaintext
1.
2.
3.
4.
class  data
{
int v1, v2, v3 
.....}



для v1 v2 v3 создаем интерфейсы

Код: plaintext
1.
2.
3.
4.
class datav1
{
data*  s_data
}


с оператором

Код: plaintext
1.
2.
3.
4.
bool operator<(datav1 f_comp )
{
renurn s_data->v1 < f_conp.v1
}


аналогично для v2 и v2

В приложении используем массив классов data

а в качестве интерфейса для сортировки и быстрого поиска
по полям v1 v2 v3 используем map или set и переходим
к элементу не сортированного массива по указателю

Будьте осторожны с конструкторами копирования и временем жизни
обьектов находящихся под указателем в datavХ

Приблизительно так.....
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / STL map сортировка по значению. / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]