Здравствуйте, igna, Вы писали:
I>Алгоритм std::includes занимается ерундой выполняя две операции сравнения (x < y и y < x) там где достаточно одной (compare(x, y)):
Здравствуйте, remark, Вы писали:
R>Издержки обобщения...
Понятно. А ведь случай типа с компаратором совсем не редкий, могли бы и в стандартную библиотеку соответствующие алгоритмы ввести. В Boost-е тоже таких алгоритмов нет, и, кстати, в Boost-е вообще не так много алгоритмов, в процентах точно меньше чем в STL.
Здравствуйте, igna, Вы писали:
I> А ведь случай типа с компаратором совсем не редкий, могли бы и в стандартную библиотеку соответствующие алгоритмы ввести.
То же самое для сортировок. И ещё, если бы возравщалось больше/меньше/равно, легче было бы получить сортировку в обратную сторону из прямого, например, lexicographical_compare
Здравствуйте, Alexander G, Вы писали:
AG>То же самое для сортировок. И ещё, если бы возравщалось больше/меньше/равно, легче было бы получить сортировку в обратную сторону из прямого, например, lexicographical_compare
Что значит "легче"?
Чтобы развернуть трёхзначный компаратор cmp(x,y)->[-1..+1], нужно применить отрицание: cmp'(x,y) = -cmp(x,y)
Чтобы развернуть булевский less(x,y)->bool — нужно обменять аргументы: greater(x,y) = less(y,x)
Здравствуйте, igna, Вы писали:
R>>Издержки обобщения...
Я бы даже сказал, издержки академичности.
Кроме того, в синтаксисе языка есть операторы сравнения — предикаты отношений порядка и эквивалентности. И они работают и используются предсказуемо.
Оператор разности же
— во-первых, не очень естественно его применять для чего-то помимо чисел (string("hello")-string("world") == -1?)
— во-вторых, для беззнаковых чисел он ведёт себя иначе, и не может применяться для сравнения.
А какого-то специального оператора знаковой разности просто нет.
Поэтому предикаты обобщать — естественно для языка, а разность — не очень-то.
I>Понятно. А ведь случай типа с компаратором совсем не редкий, могли бы и в стандартную библиотеку соответствующие алгоритмы ввести.
STL идеологически цельная. Она всюду использует открытые справа полуинтервалы. И всюду использует отношения строгого порядка.
Переделать её под другой базис можно, но это будет другая библиотека.
I>В Boost-е тоже таких алгоритмов нет, и, кстати, в Boost-е вообще не так много алгоритмов, в процентах точно меньше чем в STL.
Считать количество алгоритмов в процентах — это смешная затея.
Но если очень хочется, то берём хотя бы Boost Graph Library и переплёвываем STL сразу и надолго.
Здравствуйте, Кодт, Вы писали:
К>Считать количество алгоритмов в процентах — это смешная затея. К>Но если очень хочется, то берём хотя бы Boost Graph Library и переплёвываем STL сразу и надолго.
Boost Graph Library и есть одна из немногих библиотек с большой, возможно даже с бОльшей долей алгоритмов чем STL. Но сами по себе библиотеки с большой долей алгоритмов составляют небольшую долю Boost-а.
Здравствуйте, igna, Вы писали:
I>Boost Graph Library и есть одна из немногих библиотек с большой, возможно даже с бОльшей долей алгоритмов чем STL. Но сами по себе библиотеки с большой долей алгоритмов составляют небольшую долю Boost-а.
Наверное это потому, что на практике алгоритмы меньше нужны или достаточно стандартных
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Здравствуйте, remark, Вы писали:
R>Здравствуйте, igna, Вы писали:
I>>Алгоритм std::includes занимается ерундой выполняя две операции сравнения (x < y и y < x) там где достаточно одной (compare(x, y)):
R>Издержки обобщения...
Скорее, отсутствие в языке и библиотеке концептов.
Здравствуйте, AndrewJD, Вы писали:
AJD>Наверное это потому, что на практике алгоритмы меньше нужны или достаточно стандартных
Возможно. Но вроде Степанов хотел создать библиотеку в первую очередь именно алгоритмов, а похоже, что как раз контейнеры используют все программисты (кроме тех, кто вообще не использует STL), а алгоритмы нет.