LINUX.ORG.RU

Почему в стандарте нет std::all_of (и компании) для контейнеров?

 


1

7

Вопрос такой: что (концептуально) мешает добавить в стандартную библиотеку что-то такое:

namespace std {

template <typename Container, typename UnaryPredicate>
bool all_of(const Container& c, UnaryPrecidate p) {
    return all_of(c.begin(), c.end(), p);
}

}

Да, я понимаю, что данная версия не такая гибкая как с итераторами, однако на моей практике 90% случаев используется для всего контейнера. А добавление таких функций позволило бы писать более аккуратный код:

std::all_of(container.begin(), container.end(), [] (const T &t) { return isOk(t); }
// vs
std::all_of(container, [] (const T &t) { return isOk(t); });

Уже давно пытаются пропихнуть в стандарт ranges (это типа пары итераторов на начало и конец), который позволяет делать примерно то, что ты хочешь.

Подробностей не знаю, т.к. не слежу за темой ranges. Не знаю, почему их так долго не принимают.

utf8nowhere ★★★
()

Потому что там нет такого интерфейса и для других алгоритмов. Добавят в один, захочется добавлять в остальные, а там и так уже куча всяких перегрузок. Ради одного удобства они на такое не пойдут, надо что-то большее и это что-то делает Niebler. По документации видно, что объёмы там большие: это отдельная версия библиотеки алгоритмов с кучей адаптеров вроде drop, unique, zip и т.д. Прогресс есть (например, послабление типа итератора конца в C++17 это для ranges), но так как это непростое дело, то движется медленно.

xaizek ★★★★★
()
Ответ на: комментарий от utf8nowhere

А меня раздражает, что в std::sort нужно указывать first, last, хотя в 99% случаев ты сортируешь весь контейнер!

Kroz ★★★★★
()
Ответ на: комментарий от utf8nowhere

О, вот это красиво:

extern std::vector<int> read_data();
using namespace ranges;
std::vector<int> vi = read_data() | action::sort | action::unique;

vi |= action::sort | action::unique;

Где проголосовать?

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

я не понимаю в чем у тебя проблема прям щас такое себе в хедер сделать и юзать где хоцца. Или перегрузить оператор не умеешь? Стандарт и так уже давно помойка, нет еще что-то нашли и тянут.

anonymous
()
Ответ на: комментарий от anonymous

Я ж ведь это не (только) для себя. Я ж ведь это для людей.

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

И что с этим делать? Поставил звезду, но ведь это не поможет продвинуть в стандарт?

Законтрибьють, глядишь, и быстрее продвинут. А в комитете уже, вероятно, все места куплены.

Esper
()

Что за лицо нетрадицонной ориентации трёт обыкновенные сообщения, можно как-то посмотреть чьих рук дело?

mashina ★★★★★
()
Ответ на: комментарий от xaizek

Потому что там нет такого интерфейса и для других алгоритмов. Добавят в один, захочется добавлять в остальные,

Об этом и идётся в заголовке как раз :)

Спасибо за ссылку, интересная штука.

KennyMinigun ★★★★★
() автор топика
Ответ на: комментарий от Kroz

ничуть не лучше чем вызвать три функции в три строки кода. а проконтролировать во что это развернётся компилятором будет нереально.

dzidzitop ★★
()

как я понимаю, в stl стараются вообще не оперировать таким понятием, как “абстрактный контейнер”. если очень надо, есть #define ALL(c) (c).begin(), (c).end()(хз насколько это считается плохим кодом, потому что те самые 90% намписанного мной кода написано на олимпиадках и релейтед)

f1u77y ★★★★
()
Ответ на: комментарий от f1u77y

насколько это считается плохим кодом, потому что те самые 90% намписанного мной кода написано на олимпиадках и релейтед

Раскрываю секрет. Напиши подобные хаки в не самом маленьком проекте (конечно, это не одно такое место, и если уж встречаются хаки, то их много). Вернись к проекту через полтора года с задачей добавить функциональность. «WTF per hour» будет зашкаливать, я гарантирую это.

Deleted
()
Ответ на: комментарий от Deleted

подобные хаки

define хак

чем может быть непонятен через полтора года конкретно этот дефайн, если его нормально документировать(в том числе напомнить о нежелательности использования с вызовом функции в виде аргумента)? если же говорить о чем-то типа “код должен документировать сам себя”, то само то что это является дефайном, должно заставить обратить внимание на редактирование участка кода, содержащего этот дефайн

f1u77y ★★★★
()
Ответ на: комментарий от f1u77y

я не зря упомянул про множественную природу хаков. Вот определяю я #define 💩 ; . Ибо считаю, что написание

cout << "Hello"💩
cout << " " 💩
cout << "world!" 💩

эстетичней, с моей точки зрения. И еще пару десятков «удобных» макросов.

Всегда важно единообразие. Получаешь проект и, если там общепринятные приемы кодирования, как по маслу идет доработка, даже если там кривенькая архитектура и табы вместо пробелов. А при наличии в проекте самобытных ALL() - каждая такая «приятная встреча» сопровождается WTF и проклятьями в адрес автора, даже если это ты сам год назаж писал

его нормально документировать

и ради чего? не нужно ALL() употреблять - и документировать не придется. Однообразие рулит.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 2)

замени std на my во втором вызове...

... и пользуйся на здоровье.

хотя я такой подход не приветствую, коллеги местами пользуются. брат жив.

anonymous
()
Ответ на: комментарий от utf8nowhere

потому что нужно смотреть асм будет. а сколько чего будет копироваться будет - зависит от реализации. в коде это не видно.

dzidzitop ★★
()
Ответ на: комментарий от dzidzitop

а сколько чего будет копироваться будет - зависит от реализации. в коде это не видно.

В документации видно.

Esper
()
Ответ на: комментарий от dzidzitop

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

Первое время в документацию по стандартным алгоритмам точно так же приходится заглядывать.

Esper
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.