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

Критерий сортировки для set - C++

Войти
Регистрация
Восстановить пароль
 
IVSasha
6 / 6 / 2
Регистрация: 29.07.2015
Сообщений: 61
16.09.2015, 17:25     Критерий сортировки для set #1
Проблема в понимании этого оператора в main()
C++
1
IntSet c2(reverseOrder);
Вообще не могу понять что это такое. Кто объяснит?

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <iostream>
 
#include <set>
 
#include <algorithm>
#include <iterator>
 
// Тип критерия сортировки
template <class T>
class RuntimeCompare
{
public:
    enum CompareMode {normal, reverse};
    
private:
    CompareMode compareMode;
    
public:
    RuntimeCompare(CompareMode mode=normal)
        : compareMode(mode)
    {}
    
    bool operator()(const T &t1, const T &t2) const
    {
        return compareMode==normal ? t1<t2 : t2<t1;
    }
    
    bool operator==(const RuntimeCompare &rc) const
    {
        return compareMode == rc.compareMode;
    }
};
 
// Тип множества, использующего данный критерий сортировки
typedef std::set< int, RuntimeCompare<int> > IntSet;
 
void Fill(IntSet &c);
 
int main()
{
    // Создание, заполнение и вывод множества с обычным порядком следования
    // элементов - используется критерий сортировки по умолчанию
    IntSet c1;
    Fill(c1);
    
    // Создание критерия сортировки с обратным порядком следования элементов
    RuntimeCompare<int> reverseOrder( RuntimeCompare<int>::reverse );
    IntSet c2(reverseOrder);    // Что это вообще такое???
    Fill(c2);
 
    return 0;
}
 
void Fill(IntSet &c)
{
    c.insert(4);
    c.insert(7);
    c.insert(5);
    c.insert(3);
    c.insert(1);
    c.insert(6);
    c.insert(2);
    c.insert(5);
    // c: 1 2 3 4 5 6 7
    // или
    // c: 7 6 5 4 3 2 1
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2015, 17:25     Критерий сортировки для set
Посмотрите здесь:

итераторами для std::set C++
Перегруженный оператор () для std::set C++
C++ Программа для сортировки
C++ Сделать так, чтобы после сортировки вектора указатель показывал на тот же элемент, что и до сортировки
C++ Напишите функцию сортировки, похожую на функцию которая использовалась для сортировки массивов, с той разницей, что ее а
C++ Два счетчика для обмена и сравнений для сортировки массива
Свой компаратор для контейнера set C++
Std::set, как добавить собственную проверку уникальности для класса? C++
C++ Set_difference для set<int>
C++ Использование контейнера set для создания словаря
C++ Конструктор для std::set
C++ Для чего и как нужно использовать функции Set, Get?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4441 / 3779 / 1278
Регистрация: 14.04.2014
Сообщений: 14,872
16.09.2015, 17:36     Критерий сортировки для set #2
Это такая форма конструктора; задаётся объект, который управляет упорядочиванием элементов в множестве.
IVSasha
6 / 6 / 2
Регистрация: 29.07.2015
Сообщений: 61
16.09.2015, 17:47  [ТС]     Критерий сортировки для set #3
nmcf, все равно ничего не понятно. Я еще подумаю, может что и надумаю. Не знаю. Я не могу понять
эти записи
C++
1
2
RuntimeCompare<int> reverseOrder( RuntimeCompare<int>::reverse );
* * IntSet c2(reverseOrder);* *
Как то все сложно
DrOffset
6787 / 3998 / 917
Регистрация: 30.01.2014
Сообщений: 6,819
16.09.2015, 18:13     Критерий сортировки для set #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
IVSasha, может на int`ах понятнее будет.
C++
1
2
int a = 1; // в a чило 1
int b(1);  // в b число 1
Для классов немного сложнее, но принцип тот же.
Если заменить int на IntSet в этой записи
C++
1
IntSet c2(/*аргумент*/);
То это будет означать конструирование объекта с2 с использованием конструктора с одним аргументом.
В данном случае конструктор вот этот (второй аргумент подставляется по умолчанию):
C++
1
explicit set (const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type());
См. документацию.
Первый аргумент этого конструктора - это компаратор. Т.е. в твоем случае объект типа RuntimeCompare<int>.
Вот и получается, что
C++
1
2
RuntimeCompare<int> reverseOrder( RuntimeCompare<int>::reverse );
IntSet c2(reverseOrder);
Стоит заметить, что написать
C++
1
IntSet c2 = reverseOrder;
нельзя из-за ключевого слова explicit в объявлении конструктора (еще раз см. документацию).
IVSasha
6 / 6 / 2
Регистрация: 29.07.2015
Сообщений: 61
16.09.2015, 20:35  [ТС]     Критерий сортировки для set #5
DrOffset, что такое RuntimeCompare<int>::reverse?

Переписал программу без typedef и опять тупик.

C++
1
2
    std::set< int, RuntimeCompare<int> > c2(RuntimeCompare<int>::reverse);
    Fill2(c2);
std::set первым параметром принимает бинарный предикат. так? тогда RuntimeCompare<int>::reverse является предикатом? ерунда какая-то.

Добавлено через 9 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
Первый аргумент этого конструктора - это компаратор. Т.е. в твоем случае объект типа RuntimeCompare<int>.
первый аргумент RuntimeCompare<int>::reverse
DrOffset
6787 / 3998 / 917
Регистрация: 30.01.2014
Сообщений: 6,819
16.09.2015, 22:32     Критерий сортировки для set #6
Цитата Сообщение от IVSasha Посмотреть сообщение
что такое RuntimeCompare<int>::reverse?
Число. Значение из enum -
Цитата Сообщение от IVSasha Посмотреть сообщение
C++
1
enum CompareMode {normal, reverse};
Цитата Сообщение от IVSasha Посмотреть сообщение
ерунда какая-то.
Потому что такая ерунда написана была изначально. Вот этот конструктор:
C++
1
2
3
    RuntimeCompare(CompareMode mode=normal)
        : compareMode(mode)
    {}
объявлен без explicit. Что дает право на неявное преобразование CompareMode -> RuntimeCompare через конструктор (что и произошло в твоем случае). А это, как ты верно выразился, действительно ерунда.
Yandex
Объявления
16.09.2015, 22:32     Критерий сортировки для set
Ответ Создать тему
Опции темы

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