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

IComparable - C++

Восстановить пароль Регистрация
 
Ortaz
3 / 0 / 1
Регистрация: 02.01.2013
Сообщений: 42
29.11.2013, 01:11     IComparable #1
С++ только начал изучать

Знаю, что в С# легко можно реализовать интерфейс IComparable для своего класса, чтобы потом не мучиться с сортировкой. Как в С++ сделать то же самое?
На MSDN вроде бы интерфейс есть, но у меня почему-то не получается реализовать..
(Желательно небольшой примерчик)

Заранее спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
29.11.2013, 01:14     IComparable #2
Цитата Сообщение от Ortaz Посмотреть сообщение
Как в С++ сделать то же самое?
Определить функцию bool operator<(const YourClass &lhs, const YourClass &rhs). Её подхватит std::sort.
Ortaz
3 / 0 / 1
Регистрация: 02.01.2013
Сообщений: 42
29.11.2013, 01:19  [ТС]     IComparable #3
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Определить функцию bool operator<(const YourClass &lhs, const YourClass &rhs). Её подхватит std::sort.
У меня проблемы сильно глобальнее) Я ещё с синтаксисом не очень разобрался, даже:
C++
1
class MyClass: public IComparable{}
Подчёркивает, дескать, не видит IComparable
Я, видимо, то ли какой-то #include не сделал, то ли что-то ещё.. по этому и прошу примерчик со всем кодом..
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,405
29.11.2013, 01:21     IComparable #4
Цитата Сообщение от Ortaz Посмотреть сообщение
class MyClass: public IComparable{}
IComparable определен вообще?

Пример с сортированным множеством пользовательского типа (для сравнения используется оператор <)
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
// Litvinov Danila, 12.12.2012
#include <iostream>
#include <set>
#include <string>
#include <cstdlib>
#include <clocale>
#include <conio.h>
using namespace std;
 
 
class Train
{
    public:
        Train() {} // конструктор по-умолчанию
        // аргументированные конструкторы, используют список инициализации
        Train(int number, const string &station, const string &time) :
            number_(number), station_(station), time_(time) {}
        // для поиска по значению number
        Train(int number) : number_(number) {}
 
        // get-методы. модификатор const после функции указывает, что она не
        // изменяет состояние класса (все свойства остаются теми же)
        int    getNumber()  const { return number_; }
        string getStation() const { return station_; }
        string getTime()    const { return time_; }
 
    private:
        int number_; // поля класса
        string station_;
        string time_;
};
 
// определяем оператор сравнения двух объектов класса. Необходимо для
// использования объектов в контейнере set (ключ сортировки будет number)
bool operator < (const Train &t1, const Train &t2)
{
    return t1.getNumber() < t2.getNumber(); // если t1.number_ меньше, то истина
}
 
// перегружаем оператор вывода в поток, чтобы научить выводить объекты класса
ostream& operator << (ostream &out, const Train &t)
{
    out << "Номер поезда: " << t.getNumber() << endl // формируем поток
        << "Станция назначения: " << t.getStation() << endl
        << "Время прибытия: " << t.getTime() << endl;
    return out; // возвращаем ссылку на сформированный поток
}
 
 
int main()
{
    setlocale(LC_ALL, ""); // настраиваем консоль на ввод/вывод русских символов
    set<Train> tset; // Создаем set-контейнер объектов класса Train
    char choise = '1'; // выбор в меню
    while (choise != '0')
    {
        system("cls"); // очистка экрана
        cout << "Что желаете сделать?\n"
             << "1. Ввести новый элемент\n"
             << "2. Вывести все элементы\n"
             << "3. Поиск по номеру поезда\n"
             << "4. Поиск по названию станции назначения\n"
             << "0. Выход\n\n"
             << "Ваш выбор: ";
        cin >> choise;
        switch (choise)
        {
            case '1' :
            {// фигурные скобки чтобы переменные объявленные тут были локальными
                int number;
                string station, time;
                system("cls"); // очистка экрана
                cout << "Введите номер поезда: ";
                cin >> number;
                cout << "Введите станцию назначения: ";
                cin >> station;
                cout << "Введите время прибытия: ";
                cin >> time;
                // добавляем новый объект класса Train вызывая аргументированный
                // конструктор и передавая ему параметры
                tset.insert (Train (number, station, time));
                break;
            }
 
            case '2' :
                system("cls");
                if (tset.empty()) // если контейнер пуст
                {
                    cout << "БД пуста, добавьте для начала элементы";
                    getch(); // пауза
                    break;
                }
                // пробегаемся по всему контейнеру от начала до конца
                // it - итератор (грубо говоря указатель) на объект класса Train
                for (set<Train>::iterator it = tset.begin();
                     it != tset.end(); ++it)
                    cout << *it << endl; // уже умеет выводить объект на экран
                getch(); // пауза
                break;
 
            case '3' :
            {
                system("cls");
                if (tset.empty()) // если контейнер пуст
                {
                    cout << "БД пуста, добавьте для начала элементы";
                    getch(); // пауза
                    break;
                }
                int number;
                cout << "Введите номер поезда: ";
                cin >> number;
                // метод контейнера find вернет итератор на искомый объект, если
                // совпадений нет, то станет равным концу контейнера (set.end())
                // Происходит поиск по уникальному ключу
                set<Train>::iterator it = tset.find(number);
                if (it == tset.end())
                    cout << "Нет сопадений";
                else
                    cout << *it;
                getch();
                break;
            }
 
            case '4' :
            {
                system("cls");
                if (tset.empty()) // если контейнер пуст
                {
                    cout << "БД пуста, добавьте для начала элементы";
                    getch(); // пауза
                    break;
                }
                string station;
                cout << "Введите станцию назначения: ";
                cin >> station;
                // поиск с помощью метода find не сработает, т.к. string station
                // не является ключом контейнера (элементом, по которому идет
                // сравнение при добавлении. Вдобавок, объектов со схожим полем
                // может быть несколько, поэтому просто перебираем весь
                // контейнер и при совпадении выводим на экран
                for (set<Train>::iterator it = tset.begin();
                     it != tset.end(); ++it)
                    if (it->getStation() == station) // если совпадение
                        cout << *it << endl;
                getch(); // пауза
                break;
            }
 
            case '0' :
                break;
 
            default :
                cout << "Неверный ввод, повторите попытку";
                getch();
                break;
        } // конец switch (choise)
    } // конец цикла while (choise != '0')
 
    cout << "\n\nДо свидания!\n";
 
    return 0; // завершилось без ошибок
}
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
29.11.2013, 01:21     IComparable #5
Цитата Сообщение от Ortaz Посмотреть сообщение
Подчёркивает, дескать, не видит IComparable
Нет никаких IComparable. Определи для MyClass operator <, либо отдельно от класса функцию\функтор для сравнения.
Ortaz
3 / 0 / 1
Регистрация: 02.01.2013
Сообщений: 42
29.11.2013, 01:26  [ТС]     IComparable #6
Спасибо! Буду разбираться
Yandex
Объявления
29.11.2013, 01:26     IComparable
Ответ Создать тему
Опции темы

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