Re[14]: Исповедь C++ника
От: Умака Кумакаки Ниоткуда  
Дата: 24.12.20 11:00
Оценка:
Здравствуйте, smeeld, Вы писали:

S>или при закидывании в массив сохранять индекс, и при удалении сдвигать все эелементы с изменением их индексов


вот в этом кейсе (когда известен индекс) и при условии что порядок элементов не важен, удаление это O(1), надеюсь, хоть немного наморщив мозг, ты найдёшь решение без сдвига элементов
нормально делай — нормально будет
Re[14]: Исповедь C++ника
От: andyp  
Дата: 24.12.20 11:00
Оценка:
Здравствуйте, smeeld, Вы писали:

S>Здравствуйте, Умака Кумакаки, Вы писали:


УК>>удаление из вектора для данного кейса (когда порядок элементов не важен) это O(1) операция, т.е. не зависит от размера вектора


S>Что ты заливаешь? Удаление из list это O(1), так как там всего лишь перекинуть prev-ы и next-ы. Для удаления из массива нужно или искать его в массиве, причём линейным брутфорсом, а не бинарным поиском, так как не массив неупорядочен, или при закидывании в массив сохранять индекс, и при удалении сдвигать все эелементы с изменением их индексов.


С листе его также искать надо, а собственно удаление найденного элемннта из вектора действительно O(1). Ничего сдвигать не надо.
Re[14]: Исповедь C++ника
От: so5team https://stiffstream.com
Дата: 24.12.20 11:03
Оценка:
Здравствуйте, smeeld, Вы писали:

S>Что касается упоянутого so5stream-ом неэффективного расхода памяти, при использовании list-а, то


то хотелось бы увидеть, где я про неэффективный расход памяти вообще говорил.
Re[15]: Исповедь C++ника
От: smeeld  
Дата: 24.12.20 11:04
Оценка:
Здравствуйте, Умака Кумакаки, Вы писали:

УК>вот в этом кейсе (когда известен индекс)


Скинь ссыль, где написано, что порядок там неважен?
Re[12]: Исповедь C++ника
От: so5team https://stiffstream.com
Дата: 24.12.20 11:05
Оценка:
Здравствуйте, andyp, Вы писали:

A>Есть же эффективная схема, если порядок элементов в векторе не важен — поменять местами с последним и удалить.


Как раз для подписчиков порядок может быть очень важен.
Re[13]: Исповедь C++ника
От: B0FEE664  
Дата: 24.12.20 11:09
Оценка:
Здравствуйте, Тёмчик, Вы писали:

Тё>Ну вот, а всё "индусокод". "руссокод"


Вообще-то этот код запостил на stackoverflow какой-то грек.
И каждый день — без права на ошибку...
Re[13]: Исповедь C++ника
От: landerhigh Пират  
Дата: 24.12.20 11:10
Оценка:
Здравствуйте, so5team, Вы писали:

S>Как раз для подписчиков порядок может быть очень важен.


Это признак проблем в архитектуре.
www.blinnov.com
Re[15]: Исповедь C++ника
От: smeeld  
Дата: 24.12.20 11:11
Оценка:
Здравствуйте, so5team, Вы писали:

S>то хотелось бы увидеть, где я про неэффективный расход памяти вообще говорил.

Т.к. в list-е каждый элемент -- это динамически созданный объект, удаление которого всяко дороже, чем сдвиг нескольких соседей в vector-е.


Не расход, а управление. Я там неправильно выразился.
Re[16]: Исповедь C++ника
От: andyp  
Дата: 24.12.20 11:14
Оценка: +1
Здравствуйте, smeeld, Вы писали:

S>Скинь ссыль, где написано, что порядок там неважен?


На интерфейс класса глянь — я там гарантий некоего порядка выполнения хендлеров не вижу. Клиент же не знает, куда его хендлер воткнули и какой он там по счету. Также, удаление неэффективно, так как клиенту никакая инфа о положении его обработчика в списке не отдается
Re[13]: Исповедь C++ника
От: andyp  
Дата: 24.12.20 11:15
Оценка: +2
Здравствуйте, so5team, Вы писали:

S>Как раз для подписчиков порядок может быть очень важен.


Из интерфейса класса это никак не следует. Клиент никакой порядок себе обеспечить не может
Re[11]: Исповедь C++ника
От: B0FEE664  
Дата: 24.12.20 11:31
Оценка:
Здравствуйте, Умака Кумакаки, Вы писали:

УК>>>тайпдеф на обработчик события?

BFE>>А зачем там передавать указатель на кнопку?
УК>чтобы в обработчике событий знать, от кого пришёл ивент
Зачем? К тому же, если эти данные нужны, то их можно положить в то, что скрывается за void*.

УК>>>Тривиальная реализация publish/subscribe?

BFE>>Где там publish?
УК>функция NotifyAll это publish, AddOnButtonPress — subscribe, RemoveOnButtonPress — unsubscribe
NotifyAll это publish? У меня о publish функциональности несколько другое представление. publish — это то, что можно перечислить внешними методами в неком сторедже. Ну да не важно.

УК>>>Или каррирование частичное применение? Код вообще прозрачный, я в детстве такой писал после пары лет изучения крестов. Учитывая то, что это C++98, на C++17 всё будет выглядеть гораздо лаконичней.

BFE>>Прозрачный? Это с void* код прозрачный? И что же скрывается за void*?
УК>любой пользовательский контекст.

Вообще-то void* — это нечто прямо противоположное к прозрачному, это полностью скрытые данные или интерфейсы о которых ничего не известно.

УК>Если честно, твои вопросы меня озадачивают, ты вообще сколько кода читал/писал за свою жизнь?

Много. Сотни мегабайтов, наверное.

А вот вы пишите, что это тривиальная реализация. Тогда может объясните, зачем там динамический список обработчиков? Ведь такой список обработчиков имеет смысл только при динамическом изменении этого списка, так как иначе можно просто задать один статический обработчик в котором последовательно и явно в коде написать вызовы всех тех кто хочет быть подписан на эти вызовы. Т.е. один callback в котором просто вписаны вызовы всех других. Если же нужен именно динамический список, тогда может быть вы можете указать на задачу, где у кнопки в рантайме меняется список обработчиков у одной и той же кнопки, причём так, что список этих обработчиков не может быть составлен заранее?
И каждый день — без права на ошибку...
Re[14]: Исповедь C++ника
От: so5team https://stiffstream.com
Дата: 24.12.20 12:01
Оценка:
Здравствуйте, andyp, Вы писали:

S>>Как раз для подписчиков порядок может быть очень важен.


A>Из интерфейса класса это никак не следует.


Имя AddOnButtonPress, конечно, не такое выразительное, как push_back, но вполне себе говорит о добавлении.

A>Клиент никакой порядок себе обеспечить не может


Не может обеспечить себе нужный порядок вызова AddOnButtonPress?
Re[11]: Исповедь C++ника
От: B0FEE664  
Дата: 24.12.20 13:54
Оценка:
Здравствуйте, smeeld, Вы писали:

BFE>>Прозрачный? Это с void* код прозрачный? И что же скрывается за void*?

S>Да что угодно. Ты как-будто на C не писал. И в этом его мощь. Если автор не знает, то там скрывается, то ему даже на Go писать нельзя (а то получит ошибку конвертации interface{]-а)

Вот именно. Значит чтобы понять, что там лежит придётся весь код "прошерстить". Если на С void* понятно, то на C++ void* — неуважение к читателю.
И каждый день — без права на ошибку...
Re[17]: Исповедь C++ника
От: smeeld  
Дата: 24.12.20 14:35
Оценка:
Здравствуйте, andyp, Вы писали:

A>Здравствуйте, smeeld, Вы писали:


S>>Скинь ссыль, где написано, что порядок там неважен?


A>На интерфейс класса глянь — я там гарантий некоего порядка выполнения хендлеров не вижу.


А интерфейс класса может служить гарантией чего-то из внутренней его кухни?
Re[12]: Исповедь C++ника
От: Умака Кумакаки Ниоткуда  
Дата: 24.12.20 14:55
Оценка: :)
Здравствуйте, B0FEE664, Вы писали:

BFE>Зачем? К тому же, если эти данные нужны, то их можно положить в то, что скрывается за void*.

Затем, что во многих ситуациях я хочу оперировать с данными контрола в коллбеке ивента, например сделать кнопку неактивной, получить текст из едитбокса, отписаться от события итд итп. Положить можно в void, только зачем заставлять пользователя библиотеки реализовывать стандартную для любой UI библиотеки машинерию?

BFE>Вообще-то void* — это нечто прямо противоположное к прозрачному, это полностью скрытые данные или интерфейсы о которых ничего не известно.

ты следи за контекстом, прозрачный относилось к коду. И использование void* как пользовательского контекста это вообще практика со времён зарождения си и коллбеков.

УК>>Если честно, твои вопросы меня озадачивают, ты вообще сколько кода читал/писал за свою жизнь?

BFE>Много. Сотни мегабайтов, наверное.
А что не гигабайтов? Ты похоже далёк от разработки совсем. Судя по всему, что тебя удивляют стандартные UI паттерны, которые есть в любой UI библиотеке, начиная от MFC и заканчивая HTML DOM с его addEventListener, вероятно ты не настоящий сварщик.

BFE>А вот вы пишите, что это тривиальная реализация. Тогда может объясните, зачем там динамический список обработчиков? Ведь такой список обработчиков имеет смысл только при динамическом изменении этого списка, так как иначе можно просто задать один статический обработчик в котором последовательно и явно в коде написать вызовы всех тех кто хочет быть подписан на эти вызовы. Т.е. один callback в котором просто вписаны вызовы всех других. Если же нужен именно динамический список, тогда может быть вы можете указать на задачу, где у кнопки в рантайме меняется список обработчиков у одной и той же кнопки, причём так, что список этих обработчиков не может быть составлен заранее?


Ты прикалываешься? Это же очевидно UI библиотека, у неё не может быть статических обработчиков, так как они задаются пользователем библиотеки (в рантайме). Боже, какой же ты дремучий.
нормально делай — нормально будет
Отредактировано 24.12.2020 14:56 Умака Кумакаки . Предыдущая версия .
Re[9]: Исповедь C++ника
От: B0FEE664  
Дата: 24.12.20 15:01
Оценка:
Здравствуйте, so5team, Вы писали:

BFE>>Многие смогут прочитать и понять, например, это?:

S>Сходу не понятно, какой смысл здесь использовать std::list, а не std::vector.

Да? Т.е. зачем может понадобится добавлять динамически (!) несколько обработчиков на одну кнопку вам понятно? Расскажите, зачем?
И каждый день — без права на ошибку...
Re[15]: Исповедь C++ника
От: andyp  
Дата: 24.12.20 15:01
Оценка:
Здравствуйте, so5team, Вы писали:

S>Имя AddOnButtonPress, конечно, не такое выразительное, как push_back, но вполне себе говорит о добавлении.


Может, оно не такое выразительное как push_front

A>>Клиент никакой порядок себе обеспечить не может

S>Не может обеспечить себе нужный порядок вызова AddOnButtonPress?

Не может обеспечить порядок вызова callbacks из контейнера.
Re[18]: Исповедь C++ника
От: andyp  
Дата: 24.12.20 15:08
Оценка:
Здравствуйте, smeeld, Вы писали:

S>А интерфейс класса может служить гарантией чего-то из внутренней его кухни?


Да. Например, если бы например пользователю было доступно
add_to_front(...) и/или add_to_back(...)
то можно было бы предположить какие-то потуги на соблюдение порядка вызова подсунутых callbacks.

А то что есть сейчас, когда есть только добавлялка и убиралка, именно что никаких гарантий не дает. Наличие внутри коллекции — это вообще деталь реализации.
Re[16]: Исповедь C++ника
От: so5team https://stiffstream.com
Дата: 24.12.20 15:37
Оценка:
Здравствуйте, andyp, Вы писали:

S>>Имя AddOnButtonPress, конечно, не такое выразительное, как push_back, но вполне себе говорит о добавлении.


A>Может, оно не такое выразительное как push_front


В жизни, конечно, всякое бывает. Но из того, что мне доводилось видеть, Add обозначает именно добавление в конец.

A>>>Клиент никакой порядок себе обеспечить не может

S>>Не может обеспечить себе нужный порядок вызова AddOnButtonPress?

A>Не может обеспечить порядок вызова callbacks из контейнера.


Если добавление идет в конец, callback-и вызываются последовательно, а при удалении хронологический порядок callback-ов сохраняется, то все в порядке.

И да, сам факт вызова callback-ов именно в порядке добавления в интерфейсе вряд ли можно выразить, но это может быть описано в документации.
Re[9]: Исповедь C++ника
От: B0FEE664  
Дата: 24.12.20 15:43
Оценка:
Здравствуйте, smeeld, Вы писали:

S>По мне, так сложным можно назвать, например, такое


Метапрограммирование, да ещё с макросами, в библиотеке, да ещё в boost — это, конечно, сложный код, который хорошо иллюстрирует мой тезис. Очевидно авторы boost'овских библиотек многое понимают в стандарте C++, но умеют ли они писать на C++? Зависит от автора. Есть такие, чей код сразу можно выкидывать. Вот недавний пример.
Автор: ArtDenis
Дата: 23.07.20


Кстати, boost Serialization и boost::units использовать точно не следует.
И каждый день — без права на ошибку...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.