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

Функции сравнения - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
04.09.2012, 15:55     Функции сравнения #1
В классе, необходимо определить функции сравнения (аналогичные операторам отношения).

Какой вариант более оптимальный:
1. Определить в лоб, только функции == и > , а остальные через них (см.пример ниже).
2. Или определить каждую функцию в лоб?

Пример:
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
bool HugeInteger::isEqualTo(const HugeInteger &ob2){
    int i;
    
    if (sgn != ob2.sgn) return false;
    
    for(i = MAX_SIZE - 1; i>=0; i--)
        if(num[i] != ob2.num[i]) break;
    
    return (i >= 0 ? false: true);
}
bool HugeInteger::isNotEqualTo(const HugeInteger &ob2){
    return !isEqualTo(ob2);
}
bool HugeInteger::isGreaterThan(const HugeInteger &ob2){
    int i;
    
    if(sgn < ob2.sgn) return false;
    else if(sgn > ob2.sgn) return true;
    else if(sgn && ob2.sgn){
        for(i=0; i<MAX_SIZE; i++){
            if(num[i] > ob2.num[i]) return true;
            else if(num[i] < ob2.num[i]) return false;
        }
    }else if(!sgn && !ob2.sgn){
        for(i=0; i<MAX_SIZE; i++){
            if(num[i] < ob2.num[i]) return true;
            else if(num[i] > ob2.num[i]) return false;
        }
    }
 
    return false;
}
bool HugeInteger::isLessThan(const HugeInteger &ob2){
    return !isGreaterThan(ob2) && !isEqualTo(ob2);
}
bool HugeInteger::isGreaterThanOrEqualTo(const HugeInteger &ob2){
    return isGreaterThan(ob2) || isEqualTo(ob2);
}
bool HugeInteger::isLessThanOrEqualTo(const HugeInteger &ob2){
    return !isGreaterThan(ob2);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2012, 15:55     Функции сравнения
Посмотрите здесь:

сравнения строк C++
Символы сравнения C++
C++ сделать сравнения
шаблон функции сравнения для qsort() C++
C++ сделать сравнения
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
04.09.2012, 15:59     Функции сравнения #2
bgm313, этож лаба, а не сурёзное приложение. Как компилится так и делай)
А реально, первый вариант типа круче.

Не по теме:

Ждем-с когда набигут и будут корованы грабить



Ну можно еще поперегружать операторы.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.09.2012, 16:00     Функции сравнения #3
Лучше в каждой функции сделайте сначала несколько простых проверок, чтобы быстро отбросить тривиальные случаи (числа разных знаков, разной длины, сравнение с нулём и т. п.), потом уже полную серьёзную проверку (её можно сделать в какой-то одной функции и вызывать из других).
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
04.09.2012, 16:04  [ТС]     Функции сравнения #4
Сомнения вызывают следующие факты:
Если тело каждой функции определить в лоб, тогда программа быдут работать быстрее, не будут вызываться другие функции. С другой стороны 1 вариант, при необходимости легче видоизменять.
Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
04.09.2012, 16:05     Функции сравнения #5
bgm313, перегрузка операторов. Смотрится красиво, и работает эффективно.
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
04.09.2012, 16:06  [ТС]     Функции сравнения #6
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
сравнение с нулём
Сравнение с нулём так, де требует проверки всего массива чаров из 40 элементов в моей программе. Может быть, как -то можно сделать так, чтобы не требовалось проверять весь массив?

Добавлено через 43 секунды
Цитата Сообщение от Invader_Zim Посмотреть сообщение
bgm313, перегрузка операторов
Я понимаю, но пока нужны только функции.
Andsteadur
152 / 136 / 3
Регистрация: 23.05.2009
Сообщений: 275
04.09.2012, 16:34     Функции сравнения #7
Цитата Сообщение от bgm313 Посмотреть сообщение
Может быть, как -то можно сделать так, чтобы не требовалось проверять весь массив?
Я когда делал класс больших целых чисел объявлял еще атрибут класса, который хранил количество значащих разрядов ( где один разряд = 1 элемент массива). Сравнение при этом выглядит проще. Обход всего массива будет произведен только в случаях, когда количество значащих разрядов будет равно максимальному числу разрядов, и когда сравниваемые операнды различаются меньше чем на максимальное значение разряда.

Например, сравнение <:
1. сравниваем знаки
2. при равенстве знаков сравниваем количество значащих разрядов
3. при равенстве количества значащих разрядов сравниваем разряды числа начиная с самого значащего (при первом же несоответствии делаем соответствующий вывод)

И при таком раскладе сравнение с нулем тоже будет очень простой операцией. Нуль это либо число с количеством значащих разрядов равным нулю, либо число с одним разрядом, значение которого равно нулю, в зависимости от представления нуля.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
08.09.2012, 22:01     Функции сравнения #8
bgm313, вообще, есть такая хорошая концепция - повторное использование кода. Она означает, что если в программе уже реализован функционал A и функционал B можно реализовать через функционал A напрямую или путём комбинации с каким-либо другим функционалом, то это обязательно стоит применить. Дублирование кода ни к чему хорошему не ведёт, с другой стороны, ради эффективности оно может быть выполнено компилятором самостоятельно (inline-функции), что на самом коде никак не отразится.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2012, 22:39     Функции сравнения
Еще ссылки по теме:

C++ Операции сравнения String
Счетчик сравнения C++
C++ Перегрузка операторов сравнения

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

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
08.09.2012, 22:39     Функции сравнения #9
Цитата Сообщение от bgm313 Посмотреть сообщение
Определить в лоб, только функции == и > , а остальные через них
Достаточно перегрузить в своём классе операторы < и ==, остальное в принципе уже придумано. Но есть свои тонкости, читайте внимательнее...
Yandex
Объявления
08.09.2012, 22:39     Функции сравнения
Ответ Создать тему
Опции темы

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