Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
3 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 47

IComparable

29.11.2013, 01:11. Показов 2560. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
С++ только начал изучать

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

Заранее спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.11.2013, 01:11
Ответы с готовыми решениями:

Generic IComparable
Че в делфи совсем все туго? У меня сейчас есть record с разными методами и мне надо сделать функцию для "обрезки"...

Сортировка и IComparable
Всем добрый вечер || день. Возник вопрос по поводу компаратора. У меня есть класс, который имеет два поля - Key и Value Мне...

IComparable<T> и BinarySearch()
Господа, моя пятая точка соизволила гореть, все не как не могу понять ...

5
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
29.11.2013, 01:14
Цитата Сообщение от Ortaz Посмотреть сообщение
Как в С++ сделать то же самое?
Определить функцию bool operator<(const YourClass &lhs, const YourClass &rhs). Её подхватит std::sort.
0
3 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 47
29.11.2013, 01:19  [ТС]
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Определить функцию bool operator<(const YourClass &lhs, const YourClass &rhs). Её подхватит std::sort.
У меня проблемы сильно глобальнее) Я ещё с синтаксисом не очень разобрался, даже:
C++
1
class MyClass: public IComparable{}
Подчёркивает, дескать, не видит IComparable
Я, видимо, то ли какой-то #include не сделал, то ли что-то ещё.. по этому и прошу примерчик со всем кодом..
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
29.11.2013, 01:21
Цитата Сообщение от 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; // завершилось без ошибок
}
1
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
29.11.2013, 01:21
Цитата Сообщение от Ortaz Посмотреть сообщение
Подчёркивает, дескать, не видит IComparable
Нет никаких IComparable. Определи для MyClass operator <, либо отдельно от класса функцию\функтор для сравнения.
1
3 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 47
29.11.2013, 01:26  [ТС]
Спасибо! Буду разбираться
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.11.2013, 01:26
Помогаю со студенческими работами здесь

LINQ и IComparable
Здравствуйте. Мне нужно написать свой специфический CompareTo. Это связано с тем, что одно из значений нужно проверять на не Null перед...

По поводу icomparable interface
public int CompareTo(object obj) { if (obj is Person) { Person otherPerson = obj as Person; return this.Age - otherPerson.Age; ...

IComparable, ArrayList.Sort
При вызове Sort вылетает ошибка &quot;Дополнительные сведения: Сбой при сравнении двух элементов массива.&quot;. Не могли бы вы объяснить, в чем...

Компараторы IComparable и IComparer
Добрый вечер, нужна помощь с компараторами IComparable и IComparer, а точнее нужно их реализовать в коде using System; using...

Аналоги ICloneable, IComparable<T>, IEquatable<T>
Какие есть аналоги в FPC интерфейсам ICloneable, IComparable&lt;T&gt;, IEquatable&lt;T&gt;?


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru