Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/19: Рейтинг темы: голосов - 19, средняя оценка - 4.95
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1

template <typename T> Max(T a, T b)

23.03.2021, 22:16. Показов 3676. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
template <typename Т>
Т max(T а, Т b) {
    // Если b < а, возвращаем а, в противном случае b 
    return b < а ? а : b;
}

Заметим, что шаблон max() внутренне возвращает b < а ? а : b, а не
a < b ? b : а, чтобы гарантировать, что функция корректно ведет себя, даже когда два значе­
ния эквивалентны, но не равны.

Почему важен именно данный порядок b < а ? а : b а не a < b ? b : а?

Добавлено через 6 минут
Почему при a == b важно вернуть именно b?

Добавлено через 15 минут
оригинал из книги

"C++ Templates
The Complete Guide
Second Edition"


Note that the max() template according to [StepanovNotes] intentionally returns
“b < a ? a : b” instead of “a < b ? b : a” to ensure that the function
behaves correctly even if the two values are equivalent but not equal.
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.03.2021, 22:16
Ответы с готовыми решениями:

В чем различие template <typename T> от template <class T> ?
Добрый день ! Заметил в новых книгах применение записи template &lt;typename T&gt; вместо template &lt;class T&gt; в чем же тогда фишка...

Template<typename T> vs auto
template &lt;typename T&gt; vector&lt;T&gt; my_vec1; vector&lt;auto&gt; my_vec2;Какая разница между содержимым vec1 и vec2?

Visual c++ шаблон template <typename TT>
пытаюсь разобраться с шаблонами, но выдает ошибку я даже не знаю куда смотреть https://github.com/Paladin3by/OOP template...

18
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13202 / 6837 / 1822
Регистрация: 18.10.2014
Сообщений: 17,294
23.03.2021, 22:28
Лучший ответ Сообщение было отмечено _stanislav как решение

Решение

Цитата Сообщение от _stanislav Посмотреть сообщение
Почему при a == b важно вернуть именно b?
А объяснять, откуда взята цитата не будем?

Это цитата сноски из книги "Шаблоны. Справочник разработчика". Цитата целиком содержит ссылку [64] на http://stepanovpapers.com/notes.pdf. Вот там на страницах 61-62 и объясняется, о чем идет речь.

Степанов сначала пишет о реализации функции sort_2. Пусть мы реализовали ее так

C++
1
2
3
4
5
6
template <typename T> // T models Strict Totally Ordered
inline
void sort_2(T& x, T& y)
{
  if (!(x < y)) swap(x, y);
}
Такая реализация обладает неприятным свойством - она обменивает местами эквивалентные объекты. Поэтому лучше

C++
1
2
3
4
5
6
template <typename T> // T models Strict Totally Ordered
inline
void sort_2(T& x, T& y)
{
  if (y < x) swap(x, y);
}
и при этом разумно ожидать, чтобы поведение sort_2 было синхронизировано с поведением min и max. То есть если мы выполнили sort_2(a, b), то после этого min(a, b) должно возвращать именно a, а max(a, b) должно возвращать именно b.

Вот именно в таком контексте выбор b для возвращения из max имеет смысл.
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
24.03.2021, 06:29  [ТС]
Добавлено через 40 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
чтобы поведение sort_2 было синхронизировано с поведением min и max.
короче, нужно что бы функции min и max как бы оставляли объекты на месте в отсортированном порядке если объекты равны?

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вот именно в таком контексте выбор b для возвращения из max имеет смысл.
Спасибо понятно, а что имеется ввиду под:

эквивалентны, но не равны?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13202 / 6837 / 1822
Регистрация: 18.10.2014
Сообщений: 17,294
24.03.2021, 06:51
Цитата Сообщение от _stanislav Посмотреть сообщение
Спасибо понятно, а что имеется ввиду под:
эквивалентны, но не равны?
Ну там же должно быть написано. Если согласно вашему предикату сравнения не выполняется ни a < b, ни b < a, то a и b - эквивалентны. Но это совсем не означает, что a и b - равны/идентичны (в обычном смысле слова).
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
24.03.2021, 18:41  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
идентичны (в обычном смысле слова)
в смысле идентичны, у них один и тот же адрес?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13202 / 6837 / 1822
Регистрация: 18.10.2014
Сообщений: 17,294
24.03.2021, 19:13
Цитата Сообщение от _stanislav Посмотреть сообщение
в смысле идентичны, у них один и тот же адрес?
Нет. Какой адрес? При чем здесь адрес?

В смысле, что они отличимы друг от друга. Вот предикат

C++
1
2
3
4
bool even_less(unsigned a, unsigned b)
{
  return a % 2 < b % 2;
}
Согласно этому предикату все четные числа эквивалентны друг другу и все нечетные числа эквивалентны друг другу. Тем не менее 5 и 7 - это разные числа. Что тут непонятного?
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
24.03.2021, 19:24  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что тут непонятного?
то есть предикат может определять как равенство так и эквивалентность?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13202 / 6837 / 1822
Регистрация: 18.10.2014
Сообщений: 17,294
24.03.2021, 19:32
Цитата Сообщение от _stanislav Посмотреть сообщение
то есть предикат может определять как равенство так и эквивалентность?
Это зависит от того, что вы называете "равенством".

Предикат "less" определяет обобщенное соотношение "меньше", из которого выводится обобщенное соотношение "эквивалентность". А уж называть ли для краткости эквивалентность "равенством" - это уже вам решать. Помня при этом, что речь идет все таки об эквивалентности.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
24.03.2021, 19:41  [ТС]
TheCalligrapher, а если исправить эту цитату так:

..., что функция корректно ведет себя, даже когда два значе­
ния эквивалентны, и равны.

то реализация может быть любой в смысле порядка a и b?, например a < b ? b : а, потому что по сути равенство это строгая эквивалентность?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
24.03.2021, 19:51
Лучший ответ Сообщение было отмечено _stanislav как решение

Решение

_stanislav, в смысле что операторы "больше" и "меньше" могут быть переопределены таким образом, что для большого множества возможных экземпляров класса они одновременно не выполняются. При этом данные экземпляры могут быть не равными (опять же относительно переопределённого оператора "равно") или отличаться по набору байтов (отличие по memcmp() ).

Добавлено через 4 минуты
А смысл всего написанного - чтобы max() в случае, если переопределённый оператор "<" не различает a и b, выбирал именно a (что полезно, если там далее будет оператор перемещения или ещё что-то).
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
24.03.2021, 19:52  [ТС]
TRam_, да вроде бы допер, спасибо.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
24.03.2021, 19:54
Т.к. b интуитивно воспринимается как второй, дополнительный аргумент к этой функции.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
24.03.2021, 19:55  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
Т.к. b интуитивно воспринимается как второй, дополнительный аргумент к этой функции.
да, в этом тоже было дело (сбивало с толку), то что порядок аргументов важен
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
24.03.2021, 20:12
Лучший ответ Сообщение было отмечено _stanislav как решение

Решение

_stanislav, я попробую свой вариант объяснения. Представь, что операторы сравнения такого класса
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct eqv_is_no_identic
{
                 int a,b;
                 bool operator<(const eqv_is_no_identic & other)
                {
                        return a < other.b;
                }
                 bool operator>(const eqv_is_no_identic & other)
                {
                        return a > other.b;
                }
};
структуры {1,2} и {1,3} не равны но эквивалентны относительно принятого способа сравнения.
Полная идентичность и эквивалентность могут совпадать если способ сравнения опирается на сравнение всех подэлементов (мой самопал).
Проще говоря, при сравнении по окрасу, все розовые слоны эквивалентны. Независимо от толщины хоботов.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
24.03.2021, 20:17  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
struct eqv_is_no_identic
четкий пример, спасибо.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13202 / 6837 / 1822
Регистрация: 18.10.2014
Сообщений: 17,294
24.03.2021, 20:46
Цитата Сообщение от TRam_ Посмотреть сообщение
А смысл всего написанного - чтобы max() в случае, если переопределённый оператор "<" не различает a и b, выбирал именно a (что полезно, если там далее будет оператор перемещения или ещё что-то).


Cмысл всего написанного - чтобы max() выбирал именно b. А min() выбирал именно a.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
24.03.2021, 21:39
_stanislav, вообще, пример с
C++
1
return b < а ? а : b;
в ветке для выбора b подразумевает нестрогое сравнение: !(b<a) что эквивалентно b>=a и тут оказывается что при эквивалентности относительно строгого сравнения на <> выбор падёт на b а не на а. Отсюда и возможные ненужные толо-движения (swap например) в результате такого сравнения. Лучше прямое сравнение. Однако, по чести, - твой вопрос поднял простую тему показывая вещи, которые я не знал. Хороший вопрос.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13202 / 6837 / 1822
Регистрация: 18.10.2014
Сообщений: 17,294
24.03.2021, 21:49
Цитата Сообщение от IGPIGP Посмотреть сообщение
подразумевает нестрогое сравнение: !(b<a) что эквивалентно b>=a и тут оказывается что при эквивалентности относительно строгого сравнения на <> выбор падёт на b а не на а. Отсюда и возможные ненужные толо-движения (swap например) в результате такого сравнения.
Он и должен пасть на b, а не на a. В этом вся суть вопроса и ответа. Однако все эти соображения имеют смысл только в контексте синхронизации с вышеприведенной функцией sort_2 (и аналогичными функциями)
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
24.03.2021, 21:57
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Он и должен пасть на b, а не на a.
Если а эквивалентно b то легче оставить их в покое и не менять местами. Вы это и показали. Я просто решил раскрыть:
Как в тернарнике зашит
Этот незаметный шит.
у max от _stanislav, аргументы следуют в порядке a,b и далее в тексте обсуждается:
Цитата Сообщение от _stanislav Посмотреть сообщение
а не
a < b ? b : а
каюсь, - я думая о нём скопипастил верный вариант из кода, указанного в шаблоне. Получилось непонятно, да)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.03.2021, 21:57
Помогаю со студенческими работами здесь

template<typename. Var> Страуструп 11.4.3
Добрый день, читаю сейчас четвёртое издание книги Страуструпа &quot;Язык программирования C++&quot;. В разделе 11.4.3, посвященному captute-list...

Тип аргумента template<typename .Args>
Нужно выполнить определенный код при определенном типе аргумента Через шаблон или во время выполнения - не важно, хотя лучше так, как...

Использование шаблонов при описании классов template<typename type>
template&lt;typename T&gt; class List{ //оголошення списку public: List(); ~List(); void suma(T data); ...

Использование шаблонов при описании классов template<typename type>
mylist.h template&lt;typename T&gt; class MyList { public: MyList(); ~MyList(); void push_back(T data); // void...

Функция вычисления суммы элементов одномерного массива с помощью template<typename T>
Здравствуйте,помогите пожалуйста написать функцию вычисления суммы элементов одномерного массива с помощью template&lt;typename T&gt; я...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru