:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
||||||
1 | ||||||
Что выбрать: пользовательский цикл или стандартный алгоритм с предикатом24.07.2014, 15:45. Показов 1387. Ответов 20
Метки нет (Все метки)
Всем привет.
Рассмотрим код (C++03, не C++11): Кликните здесь для просмотра всего текста
Задача: копирование части информации из одного контейнера в другой. Самый очевидный и быстрый для написания вариант - это простой цикл (copyPart_Ver1). Более сложный, но в то же время, использующий стандартный алгоритм, а значит должен быть лучше понятен читающему код - copyPart_Ver2. Требуется ваше мнение, какой вариант вы бы предпочли и почему? Или может быть есть другие варианты? P.S. на C++11 я бы однозначно предпочел второй вариант, заменив конечно функциональный объект лямбдой.
0
|
24.07.2014, 15:45 | |
Ответы с готовыми решениями:
20
Алгоритм с применением вложенных базовых структур «цикл с предусловием» или «цикл с постусловием» Разработать алгоритм с применением вложенных базовых структур «цикл с предусловием» или «цикл с постусловием» Разработать алгоритм с применением вложенных базовых структур «цикл с предусловием» или «цикл с постусловием», составить Разработать алгоритм с применением вложенных базовых структур «цикл с предусловием» или «цикл с постусловием», составить |
3224 / 1751 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
24.07.2014, 16:47 | 2 |
Ну, с современной точки зрения читаемость - самый важный критерий.
0
|
3224 / 1751 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
24.07.2014, 16:56 | 4 |
Ну, ответ очевиден, по-моему. Алгоритм штука стандартная, и на него достаточно только бросить взгляд, а в цикле, написанном программистом, надо разбираться. Да и зачем писать циклы, если их за нас уже написал Степанов.
2
|
194 / 174 / 30
Регистрация: 10.07.2012
Сообщений: 800
|
|
24.07.2014, 17:25 | 6 |
мне кажется очень сомнительной идея скрывать под именем какого-то алгоритма то, что пишется в две очень легкие для восприятия строки. во-первых, я не могу угадать, что назвали словом "transform" - мне надо лезть смотреть, во-вторых, мне надо залезть посмотреть реализацию, ибо мало ли что. хотя если мне известно все содержимое <algorithm>, то мне может быть так же легко читать код со стандартными функциями.
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
24.07.2014, 17:27 | 7 |
Значит вы не пишете на С++ и полезли смотреть исходник на С++, не изучая данный язык. В таком раскладе - да, нужно прочесть доку. Во всех остальных программист С++ знает что такое std::transform.
По теме: it depends. Предпочитаю алгоритмы, но чаще всего совсем не хочется хламить файл функторами на каждый чих, поэтому в основном все же for.
4
|
194 / 174 / 30
Регистрация: 10.07.2012
Сообщений: 800
|
|
24.07.2014, 17:33 | 9 |
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
24.07.2014, 17:34 | 10 |
salam, Что ж. Это странно. Пишете профессионально и прочитали хотя бы пару книг по С++? Я удивлен.
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
24.07.2014, 18:22 | 11 |
В конкретно этом случае мне ближе обычный цикл.
В варианте с функтором добавляется новая сущность Крайне простая, используется единожды. Т.е. если пример перенесен с поправкой на имена переменных, то я бы не плодил новых классов. Можно, кстати, определение функтоар поместить внутрь функции, где он используется, чтобы подчеркнуть локальность. И тогда уже точно увидим, что простой цикл компактнее. Использование такого функтора будет оправданым если, например, в коде рядом сосредоночено несколько преобразований контейнеров и они уже написаны на стантанртных алгоритмах.
2
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
||||||
24.07.2014, 20:23 | 13 | |||||
Очевидно, что стоит отдавать предпочтение более декларативному способу написания кода, а значит стандартным алгоритмам. Я сам предпочитаю следующие способы ( 1-ый самый предпочтительный, далее по убыванию )
1) если функтор достаточно простой ( как в примере топикстартера ), то использую bind
3) функциональную композицию при помощи boost::bind'а, но только в случае, если она не больше 2-3 строк 4) range-based loop 5) цикл Добавлено через 8 минут А, ну и если лямбды не завезли и с функциональной композицией тяжко - предпочитаю использовать свободные фукнции в качестве предикатов. Структурки с перегруженным operator() не нужны. Хранить состояние - зло
1
|
Ушел с форума
|
|
24.07.2014, 20:39 | 14 |
Однозначно первый вариант.
Он незамысловат и при этом выражен меньшим количеством строк.
0
|
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
24.07.2014, 22:10 | 15 |
Сама эта мысль правильная, спора нет. Но вот в данном случае transform используется не по прямому назначению, ведь он предназначен для внесения изменений в исходный набор элементов, а не для их копирования. Так что вместо внесения ясности и декларации намерений использование этого алгоритма обманывает читающего и сбивает с толку. Раз уж нет возможности применить copy, лучше прибегнуть к явно написанному циклу.
1
|
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
|
||||||
24.07.2014, 22:23 | 18 | |||||
Tulosba, можно взять boost и примерно так:
0
|
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
24.07.2014, 22:31 | 19 |
Видимо, я не совсем удачно сформулировал. Смысл алгоритма - в применении некоторого преобразования к исходному набору данных. Сейчас, по некотором размышлении, я склоняюсь к мысли, что в описанном случае transform тоже может выражать замысел, если преобразованием считаем извлечение second. Хотя copy всё же кажется мне более подходящим по смыслу.
Так что основная моя мысль заключается в том, что для соблюдения принципов intentional programming надо учитывать предназначение алгоритмов. И как видим, иногда лучше не пожалеть нескольких минут на тщательное обдумывание вопроса.
0
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
|
24.07.2014, 22:46 | 20 |
0
|
24.07.2014, 22:46 | |
24.07.2014, 22:46 | |
Помогаю со студенческими работами здесь
20
Преобразование типа из пользовательского в стандартный и из стандартного в пользовательский Передать в пользовательский элемент управления DataTemplate или что-то похожее Что выбрать - Amd a8 3530mx или intel core i5 2450 или i7 2670qm? Что выбрать на данный момент, что рекомендуете: Веб или Андроид? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |