Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
IVSasha
6 / 6 / 2
Регистрация: 29.07.2015
Сообщений: 61
#1

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

16.09.2015, 17:25. Просмотров 394. Ответов 5
Метки нет (Все метки)

Проблема в понимании этого оператора в 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
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2015, 17:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Критерий сортировки для set (C++):

Как убрать дублирующиеся (повторяющиеся) слова, используя <set> или <map> без сортировки? - C++
Здравствуйте! Пытаюсь убрать из текстового файла дублирующие слова, чтобы они были уникальны без сортировки, но моя попытка не увенчалось...

Составить блок – схемы для шейкер- сортировки и сортировки Шелла - C++
Доброго времени суток, очень нужна ваша помощь в решении данной проблемы, буду бесконечно благодарен. Составить блок – схемы для шейкер-...

Составить программы для пузырьковой сортировки и сортировки посредством выбора с применением оператора while - C++
Доброго времени суток, очень нужна ваша помощь в решении данной проблемы, буду бесконечно благодарен. Составить программы для пузырьковой...

Напишите функцию сортировки, похожую на функцию которая использовалась для сортировки массивов, с той разницей, что ее а - C++
Напишите функцию сортировки, похожую на функцию которая использовалась для сортировки массивов, с той разницей, что ее аргументом должен...

Позиция элемента в контейнере STL кон. SET, поиск контейнер set словарь позиция - C++
Есть код №1. Он выводить на экран позицию нужного мне слова (только если в середине 1 слово а не 2 и больше например только &quot;privet&quot;. А...

Конструктор для std::set - C++
struct TrainFilterCompany { TrainFilterCompany ( const set&lt;string&gt; &amp; companies ) : m_Companies ( companies ) { } bool...

5
nmcf
5677 / 4987 / 1700
Регистрация: 14.04.2014
Сообщений: 20,341
16.09.2015, 17:36 #2
Это такая форма конструктора; задаётся объект, который управляет упорядочиванием элементов в множестве.
1
IVSasha
6 / 6 / 2
Регистрация: 29.07.2015
Сообщений: 61
16.09.2015, 17:47  [ТС] #3
nmcf, все равно ничего не понятно. Я еще подумаю, может что и надумаю. Не знаю. Я не могу понять
эти записи
C++
1
2
RuntimeCompare<int> reverseOrder( RuntimeCompare<int>::reverse );
* * IntSet c2(reverseOrder);* *
Как то все сложно
0
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
16.09.2015, 18:13 #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 в объявлении конструктора (еще раз см. документацию).
1
IVSasha
6 / 6 / 2
Регистрация: 29.07.2015
Сообщений: 61
16.09.2015, 20:35  [ТС] #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
0
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
16.09.2015, 22:32 #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 через конструктор (что и произошло в твоем случае). А это, как ты верно выразился, действительно ерунда.
1
16.09.2015, 22:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2015, 22:32
Привет! Вот еще темы с ответами:

Set_difference для set<int> - C++
Данный код породдает сообщение об ошибке при компиляции, почему он не запускается? #include &lt;set&gt; #include &lt;algorithm&gt; #include...

Использование lower_bound для set - C++
У меня вопрос у использованию lower_bound на set. Допустим: set &lt;int&gt; s; s.insert (2); s.insert (3); s.insert (6); s.insert...

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

Перегруженный оператор () для std::set - C++
Зачем в СТЛ в контейренах типу SET и других перегружать оператор () вот код struct WordEntryLessById { bool operator ()...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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