Russian Qt Forum
Ноябрь 15, 2024, 08:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 6 7 [8]   Вниз
  Печать  
Автор Тема: Итераторы  (Прочитано 47260 раз)
Akon
Гость
« Ответ #105 : Апрель 22, 2013, 14:28 »

Цитировать
Ах как удобно повторять написанное в книжке  Не спорю, концептуально это красиво. Но давайте копнем чуть глубже на том же живом примере. Вот выше утверждалось что с copy_if код пригоден как для вектора, так и для списка. Возможно "работать будет" - но вот делать будет совсем не то что нужно. Чего же мы перемещаем все элементы списка при удалении некоторых? Зачем тогда список если адреса элементов уплывают? Грамотно удалять из списка его методом remove_if или erase в цикле. Но ни то ни другое не обобщается на линейные контейнеры как вектор. Вот и закончилась "концептуальная красота/общность" 
Полагаете, STL столько существует ради концептуальной красоты?  Веселый Вот вы ставите под сомнение некоторые фундаментальные вещи, только потому, что они, возможно, плохо подходят для решения ваших частных задач... А вот у меня задача - отсортировать контейнер. Как я по-вашему должен ее решить? А вот у меня есть некий компоновщик (паттерн), и мне нужно обойти всех парентов, начиная с текущего элемента и заканчивая топовым (т.е. имеем контейнер в виде дерева и нужно дойти до корня). Как я по-вашему должен ее решить? А если я захочу закэшировать результат обхода в линейном контейнере? Это мои реальные задачи, столь же "глубокие", как и ваши.
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #106 : Апрель 22, 2013, 14:43 »

Но и в этом случае я не вижу необходимости хоть каких-то функторов/лямбд и.т.п. Почему бы не решить простейшими базовыми средствами языка?
Because We can \o/  Смеющийся
А если серьезно, то и лямбды и функторы  - это базовые средства языка (может уже и не простейшие, но и не сложные).
Основной их плюс в том что их можно объявить локально максимально близко к месту использования.
И очевидное удаление элементов из массива - можно размазывать сопли с remove_if (copy_if) а лучше простым и ясным for
Еще раз про сопли - в вашем коде 5 циклов, в моем 1.

Цитата: Igors
Но давайте копнем чуть глубже на том же живом примере. Вот выше утверждалось что с copy_if код пригоден как для вектора, так и для списка. Возможно "работать будет" - но вот делать будет совсем не то что нужно.
А давайте вы немного подумаете, и все таки попытаетесь понять что мир программирования не ограничивается Вашими задачами. Я веду разработку под 4 платформы одновременно (PC-Win7, PC-Ubuntu, Cortex-A-Linux, STM32F4/F1). Многие функции у них пересекаются. У меня есть довольно большие куски кода которые работают на каждой из платформ. Поэтому я вам говорю : оптимально - это не всегда быстро.
« Последнее редактирование: Апрель 22, 2013, 14:45 от alex312 » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #107 : Апрель 23, 2013, 07:16 »

По поводу "моих" задач - да бог с Вами, разве это "задача"? Это чисто техническая вещь которая может возникнуть в любой предметной области, хоть в том же Model-View которое (почему-то) использует индексы

А если серьезно, то и лямбды и функторы  - это базовые средства языка (может уже и не простейшие, но и не сложные).
Основной их плюс в том что их можно объявить локально максимально близко к месту использования.
...
Еще раз про сопли - в вашем коде 5 циклов, в моем 1.
И что, это уже круто? Если std::transform, copy_if  и.т.п.- это уже не цикл, а "лучше". А мне кажется это просто снобизм/фетишизм. Я испытываю теплые чувства к лямбде со времен AutoLisp, задолго до ее появления здесь. Но надо знать меру. Обратите внимание что обычно стоит в теле лямбды - что-то однострочное. Тогда действительно выходит компактно/красиво. А у Вас? Увидев Ваши transform/copy_if я еще ничего не могу понять  - мне надо найти функтор. Это мудрено, надо учесть std::bind и std::placeholder что Вы накрутили. Ладно, наконец прорвался, но имя отсутствует (безликий оператор ()) что он делает - хз. Ваш код прямо-таки кричит "смотрите как много я знаю", но разбираться с ним никто не захочет (включая тех кто здесь с Вами согласен).

Я считаю нужно делать не так. Надо выделить ф-цию несущую основную смысловую нагрузку, дать ей хорошее имя, возможно добавить строку примечаний. Человек работающий с кодом разберется в ней (обычно достаточно имени/примечания, в тело вникать необязательно) а дальше просто будет ориентироваться на вызовы. То есть наоборот, подчеркнуть "сильную долю", а не всячески прятать ее в глубине функторов и лямбд.

Еще раз ...
А давайте вы немного подумаете, и все таки попытаетесь понять что
Есть предложение спокойнее относиться к другим точкам зрения  Улыбающийся
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #108 : Апрель 23, 2013, 10:07 »

И что, это уже круто?
Это не круто - это нормально, обыденно.
Если std::transform, copy_if  и.т.п.- это уже не цикл, а "лучше". А мне кажется это просто снобизм/фетишизм.
Циклы в std::transform, copy_if писали люди поумнее меня, эти циклы стандартизированы, документированы, оттестированы миллионами, используются миллионами - и исходя из вышеперечисленного, да эти циклы лучше.
Ваш код прямо-таки кричит "смотрите как много я знаю".
Поэтому я пишу на C++, и не использую паскаль  Смеющийся
Есть предложение спокойнее относиться к другим точкам зрения  Улыбающийся
Поддерживаю.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #109 : Апрель 23, 2013, 16:46 »

Циклы в std::transform, copy_if писали люди поумнее меня,
"Слепая вера" (типа да примем без доказательств) конечно делает жизнь проще/практичнее - но в то же время IMO ущемляет программиста (кирпича-то нет, просто поверил)
Записан
Страниц: 1 ... 6 7 [8]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 23.