Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/29: Рейтинг темы: голосов - 29, средняя оценка - 4.90
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459

Зачем существует функция max()?

20.11.2018, 13:03. Показов 6123. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго! Поймал в чужом коде функцию max() из библиотеки algorithm, и меня начал мучить вопрос, зачем существует эта функция. Ведь простой тернарный оператор (который так-то и лежит в той функции) будет работать быстрее без всяких посредственность нежели с ними. Хорошо, если лень его часто писать, тогда почему не написать макрос? Функцию особенно странно видеть при поиске максимального элемента в массиве.
Так вот, я пишу это потому что хочу понять, насколько мои негодования по поводу существования max() оправданы, может я где-то ошибаюсь или чего-то не понимаю, навряд ли бы в STL просто так пихали такие, по моему мнению, бесполезные функции.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.11.2018, 13:03
Ответы с готовыми решениями:

Зачем существует два способа обращения к объектам?
Здравствуйте. Зачем существует два способа обращения к объектам: по ссылке и по указателю?

Функция sqrt: существует более одного экземпляра. Функция перегруженная
#include <iostream> #include <math.h> #include <iomanip> using namespace std; int main(){ float s, p; int c, a; s=0; ...

Задать значения вещественным элементам массивов A(6),B(3),C(10) и вычислить Y=max(max(A),max(B),max(C)
Задать значения вещественным элементам массивов A(6),B(3),C(10) и вычислить Y=max(max(A),max(B),max(C))

9
 Аватар для Nishen
1357 / 856 / 365
Регистрация: 26.02.2015
Сообщений: 3,814
20.11.2018, 13:12
Ну, ты же можешь в нее передать не только 2 значения, но и std::initializer_list, например. Скотт Мейерс вообще утверждает, что макросами лучше не пользоваться.

Добавлено через 1 минуту
По-мимо этого, ты можешь в функцию передать свой компаратор.
0
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
20.11.2018, 13:13  [ТС]
Nishen, ну а если у меня массив, например, мне уже другая функция понадобится, а max(), по сути, будет бесполезна.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
20.11.2018, 13:17
Лучший ответ Сообщение было отмечено Cortas как решение

Решение

Цитата Сообщение от Cortas Посмотреть сообщение
Хорошо, если лень его часто писать, тогда почему не написать макрос?
Даешь народу макрос - аналог std::max для двух параметров?
Цитата Сообщение от Cortas Посмотреть сообщение
Функцию особенно странно видеть при поиске максимального элемента в массиве.
Для этого используется std::max_element, а не std::max.
Цитата Сообщение от Cortas Посмотреть сообщение
Ведь простой тернарный оператор (который так-то и лежит в той функции) будет работать быстрее
Кто сказал? Берем две функции:
C++
1
2
3
4
5
6
7
8
9
10
#include <algorithm>
 
int square1(int f, int s) {
    return f < s? s: f;
}
 
 
int square2(int f, int s) {
    return std::max(f, s);
}
Берем и смотрим что могёт получиться:
https://gcc.godbolt.org/z/7Q8u4t
Assembler
1
2
3
4
5
6
7
8
9
10
square1(int, int):
        cmp     edi, esi
        mov     eax, esi
        cmovge  eax, edi
        ret
square2(int, int):
        cmp     edi, esi
        mov     eax, esi
        cmovge  eax, edi
        ret
очевидно - условный оператор быстрее.
1
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
20.11.2018, 13:20
Лучший ответ Сообщение было отмечено Cortas как решение

Решение

Цитата Сообщение от Cortas Посмотреть сообщение
зачем существует эта функция
Функция имеет осмысленное имя, увидев которое в коде, сразу ясно, что здесь происходит. Тернарный оператор еще проанализировать придется.

Цитата Сообщение от Cortas Посмотреть сообщение
Ведь простой тернарный оператор (который так-то и лежит в той функции) будет работать быстрее без всяких посредственность нежели с ними
Чем он будет быстрее? Компилятор имеет право при оптимизации выполнить подстановку кода функции, и тогда никакого фактического вызова функции не будет. Низкоуровневая оптимизация - задача компилятора. Задача программиста - в первую очередь писать читаемый код.

Цитата Сообщение от Cortas Посмотреть сообщение
почему не написать макрос
Макрос != функция.
1
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
20.11.2018, 13:27  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Даешь народу макрос - аналог std::max для двух параметров?
C++
1
2
//если я правильно вас понял:
#define getmax(a, b) (a > b ? a : b)
Цитата Сообщение от Croessmah Посмотреть сообщение
Для этого используется std::max_element, а не std::max.
Это я знаю, лишь говорю, что странно использовать именно max() для этих дел.
Цитата Сообщение от valen10 Посмотреть сообщение
? Компилятор имеет право при оптимизации выполнить подстановку кода функции
Думал, что компилятор глупее, но глупее оказался кое-кто другой
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
20.11.2018, 13:31
Цитата Сообщение от Cortas Посмотреть сообщение
если я правильно вас понял:
C++
1
getmax(a + b, a - 5);
поведение будет сильно отличаться от поведения std::max.
То есть данный (и любой другой) макрос не является аналогом, хотя бы потому, что работает на уровне текста.

Цитата Сообщение от Cortas Посмотреть сообщение
что странно использовать именно max() для этих дел
Как его используют для этих дел? Пример приведите.
Использовать Ваш макрос getmax для этих целей тоже будет странно,
но это же ведь не проблемы самого макроса, так ведь?
0
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
20.11.2018, 13:37  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
макрос не является аналогом
ну, потому их нужно использовать аккуратно.
Цитата Сообщение от Croessmah Посмотреть сообщение
Как его используют для этих дел? Пример приведите.
C++
1
2
3
4
//я вот об этом:
int mx = 0;
for(int i = 0; i < vect.size(); i++)
  mx = max(mx, vect[i]);
Понятное дело, что и макрос и функция в данном случае - сомнительное решение.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
20.11.2018, 14:05
Цитата Сообщение от Cortas Посмотреть сообщение
ну, потому их нужно использовать аккуратно
Или вообще не использовать там, где не надо.
Цитата Сообщение от Cortas Посмотреть сообщение
я вот об этом
Ну так а max здесь причем?
Так реализовали алгоритм поиска.
Замена здесь max на условный оператор ничего не изменит в этом плане:
C++
1
2
3
int mx = 0;
for(int i = 0; i < vect.size(); i++)
  mx = mx < vect[i]? vect[i]: mx;
Но уже здесь видна одна проблема при использовании условного оператора вместо std::max.
Для отображения проблемы обратимся к чему-то более затратному, например, к std::map::operator[].
C++
1
2
3
4
std::map<std::string, int> m;
//...
int mx1 = std::max(m["key1"], m["key2"]);
int mx2 = (m["key2"] < m["key1"])? m["key1"]: m["key2"];
Видно, что теперь в условном операторе нужно выполнить поиск элемента в самом условии и после еще раз для возврата нужного значения. В таком случае условный оператор может быть очень плохим решением.

И это только для двух значений. А насколько удобоваримым будет код с условными операторами, если нужно определить максимум из четырех чисел?

Макрос getmax также будет не очень удобен по всем тем причинам, по которым макросы не рекомендуют использовать.

Также вынос подобного (или иного) функционала в отдельную функцию (можно и в макрос, но вспоминаем "ужасы макросов") дает возможность менять реализацию лишь этой функции, не меняя реализацию всего остального кода при условии, что не меняется внешнее поведение функции.
Возьмем гипотетическую ситуацию, что std::max внутри использует условный оператор для реализации сравнения двух чисел. Но вот код компилируется под платформу в которой железяка умеет на аппаратном уровне очень быстро выдавать максимальное из двух чисел. В таком случае под эту железяку можно изменить реализацию функции с использованием данной аппаратной возможности. При этом клиентский код вообще никак не изменится.
1
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
20.11.2018, 14:14  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Замена здесь max на условный оператор ничего не изменит в этом плане
Я же сказал, что понятное дело, использование хоть макроса, хоть функции, хоть чистого тернарного оператора - странно решение
Цитата Сообщение от Croessmah Посмотреть сообщение
например, к std::map::operator[]
Да Страуструп упаси так делать! :0

С остальным полностью согласен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.11.2018, 14:14
Помогаю со студенческими работами здесь

Min и max в одной функции: существует ли готовое решение в стандартной библиотеке?
Существует ли в C++ функция, которая бы работала как std::min и std:max одновременно? То есть принимала бы три аргумента - минимальное...

Даны действительные числа A, B, C. Получить max(a,a+b)+max(a,b+c,a+b) \ 1+max(ab,bc)+max(a+bc,15,ac)
Всем привет)Помогите пожалуйста написать в С++ Даны действительные числа A, B, C. Получить max(a,a+b)+max(a,b+c,a+b) \...

Зачем нужна функция GetPrivateProfileString?
Объяснить &quot;кусочек&quot; кода)), из то го что есть я понял что с начало в комбобокс добавляются значения с помощью функции InserCBItem, далее...

существует ли в языке Си функция replace? и если существует то как работает?
А если её нет то каким образом можно изменить числа входящие в массив?

Чем отличается функция Max от Max<>?
Чем отличается функция Max от Max&lt;&gt;? const n = 10; var a: List&lt;integer&gt;; b: array of integer; begin for var...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
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 - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru