Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
1

адаптеры

04.11.2011, 20:03. Показов 3776. Ответов 35
Метки нет (Все метки)

добрый вечер интересно ваше мнение.
такие вещи как адаптеры, биндеры позиционируются как шибко быстро работающие.
и рекомендуется ими активно пользоваться. Например вместо попыток определить собственную шаблон-функцию сравнения, которая сравнивает входное значение с неким фиксированным значением, рекомендуется юзать биндер, который сделает нам из функции less принимающей 2 параметра для сравнения, функтор принимающий одно значение. Все это делается через создание шаблонных структур ну или классов в которых один из параметров less становится членом, и имеется небезызвестный operator()() который и используют стандартные алгоритмы, когда мы даем на вход сий класс.
Так вот поделитесь мнением, действительно ли через биндеры это шибко быстрее, чем через просто функцию, на ваш взгляд? В процессе работы алгоритма ну например форич, при такой схеме во первых вызывается конструктор столько раз сколько элементов надо пройти, вызывается деструктор столько же раз, ну и вызывается сам operator()(). Это работает действительно быстрее, чем просто вызов какой либо своей функции? Как считаете?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.11.2011, 20:03
Ответы с готовыми решениями:

Адаптеры
Какие плюсы от использования адаптеров, queue, stack, priority_queue, если они все равно используют...

Функциональные адаптеры
Для произвольного целочисленного массива данных написать функцию которая уменьшает все элементы в 2...

Стандартные функторы-адаптеры
Добрый вечер! Хочу отсортировать контейнер, заполненный указателями на объекты класса Class,...

Функторы, алгоритмы и адаптеры
Нужна помощь! 1 Нужно создать multimap и multiset на основе элементов типа класса CPerson,...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
35
бжни
2472 / 1681 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
04.11.2011, 20:38 2
не думаю, что с адаптарами может быть сильно быстрее
вообще мне кажется, что эти все замашки - попытки быть похожим на функциональный язык, коим c++ не является
в общем с появлением лямбда функций в новом стандарте я не вижу сильно смысла использовать всех извращения stl'а
0
Jesus loves me
Эксперт С++
5164 / 3137 / 353
Регистрация: 12.12.2009
Сообщений: 7,924
Записей в блоге: 2
04.11.2011, 20:38 3
Цитата Сообщение от AzaKendler Посмотреть сообщение
В процессе работы алгоритма ну например форич, при такой схеме во первых вызывается конструктор столько раз сколько элементов надо пройти, вызывается деструктор столько же раз, ну и вызывается сам operator()()
Почему, конструктор для биндера вызовется один раз, дальше будет вызываться только operator(), ну и деструктор соответственно тоже один раз. Или ты о копирующих конструкторах для элементов?


Цитата Сообщение от AzaKendler Посмотреть сообщение
Это работает действительно быстрее, чем просто вызов какой либо своей функции?
Можно умудриться написать код, который будет работать быстрее, только имхо - делать это нужно при острой необходимости. В общем случае зачем писать что-то самому, если в стандартной библиотеке уже все написанно.
0
1999 / 1599 / 488
Регистрация: 31.05.2009
Сообщений: 2,990
04.11.2011, 20:40 4
Цитата Сообщение от AzaKendler Посмотреть сообщение
Так вот поделитесь мнением, действительно ли через биндеры это шибко быстрее, чем через просто функцию, на ваш взгляд?
Биндеры и функции это абсолютно разные вещи. Биндер просто создаёт функтор, который будет использоваться алгоритмом. Поэтому биндеры и функции, при всём желании, сравнивать нельзя
Цитата Сообщение от AzaKendler Посмотреть сообщение
В процессе работы алгоритма ну например форич, при такой схеме во первых вызывается конструктор столько раз сколько элементов надо пройти, вызывается деструктор столько же раз, ну и вызывается сам operator()().
Один раз вызывается конструктор при создании объекта и один раз вызывается деструктор при его разрушении.
Цитата Сообщение от AzaKendler Посмотреть сообщение
Это работает действительно быстрее, чем просто вызов какой либо своей функции? Как считаете?
По поводу функторов см. здесь
0
Jesus loves me
Эксперт С++
5164 / 3137 / 353
Регистрация: 12.12.2009
Сообщений: 7,924
Записей в блоге: 2
04.11.2011, 20:48 5
Цитата Сообщение от Kastaneda Посмотреть сообщение
конструктор для биндера
блин, биндеры это функции.

Не по теме:

голова PHP забита, родной С++ забывать стал...

0
Заблокирован
04.11.2011, 20:55 6
Цитата Сообщение от AzaKendler Посмотреть сообщение
добрый вечер интересно ваше мнение.
такие вещи как адаптеры, биндеры позиционируются как шибко быстро работающие.
и рекомендуется ими активно пользоваться. Например вместо попыток определить собственную шаблон-функцию сравнения, которая сравнивает входное значение с неким фиксированным значением, рекомендуется юзать биндер, который сделает нам из функции less принимающей 2 параметра для сравнения, функтор принимающий одно значение. Все это делается через создание шаблонных структур ну или классов в которых один из параметров less становится членом, и имеется небезызвестный operator()() который и используют стандартные алгоритмы, когда мы даем на вход сий класс.
Так вот поделитесь мнением, действительно ли через биндеры это шибко быстрее, чем через просто функцию, на ваш взгляд? В процессе работы алгоритма ну например форич, при такой схеме во первых вызывается конструктор столько раз сколько элементов надо пройти, вызывается деструктор столько же раз, ну и вызывается сам operator()(). Это работает действительно быстрее, чем просто вызов какой либо своей функции? Как считаете?
По этому поводу написано в книге Майерса под названием то ли 50 приемов эффективного программирования, то ли 35 приемов эффективного программирование.
Главное преимущество адаптеров состоит в том, что если они inline, то компилятор может их встроить в алгоритм при инстанциировании. А когда используется указатель на функцию, то компилятор это не может сделать.
0
бжни
2472 / 1681 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
04.11.2011, 21:05 7
Цитата Сообщение от Сыроежка Посмотреть сообщение
А когда используется указатель на функцию, то компилятор это не может сделать.
когда алгоритму передается конкретная функция - с чего бы ему этого не сделать?
0
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
04.11.2011, 22:42  [ТС] 8
ну если я правильно понял то создается так называемый временный объект. т.е. мы не создаем где то там
объект класса и не суем один и тот же в алгоритм а создаем каждый раз временный объект который генерится из шаблона. Я предполагаю что конструктор вызывается чтолько раз сколько объектов контейнера надо обойти, соответственно столько же раз вызовется деструктор и оператор ()(), плюсом это все вызывается через функцию помощник. Поэтому мне и стало интересно ваше мнение. Я приложил картинку где написано что все это кул. В рамках стл это и правда кул. Универсально. Но...разве так быстро как пишут? Нельзя сравнивать функцию и биндер? почему с? в этой картиночке биндер это как раз функция помощник которая генерит класс и подсовывает его в алгоритм, и уже оператор()() этого класса делает сравнение

В общем то ответ вы дали. В принципе не быстро (или не быстрее) но в рамках стл - это правильно и удобно.
0
Миниатюры
адаптеры  
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
04.11.2011, 22:47  [ТС] 9
вот еще пример от него же
0
Миниатюры
адаптеры  
бжни
2472 / 1681 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
04.11.2011, 22:54 10
В фразе "Читаемо? Эффективно?" на читаемо предназначался сарказм автора
0
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
04.11.2011, 22:58  [ТС] 11
трудно не согласится. но он все таки писал всерьез и если набить правую руку, то..вполне читаемо
0
бжни
2472 / 1681 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
04.11.2011, 23:06 12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <algorithm>
#include <vector>
#include <functional>
 
bool more_then_7(int value)
{
    return value > 7;
}
 
int main()
{
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    std::vector<int> v(arr, arr + sizeof(arr)/sizeof(arr[0]));
    for (size_t i=0;i<1e7;++i)
    {
#ifdef STL_WAY
        std::find_if(v.begin(), v.end(), std::bind2nd(std::greater<int>(), 7));
#else
        std::find_if(v.begin(), v.end(), more_then_7);
#endif
    }
}
Bash
1
2
3
4
5
6
7
8
9
10
alexxx@alexxx-laptop:~/c++$ g++ -DSTL_WAY 1.cpp && time ./a.out 
 
real    0m5.862s
user    0m5.732s
sys 0m0.068s
alexxx@alexxx-laptop:~/c++$ g++ 1.cpp && time ./a.out 
 
real    0m4.115s
user    0m3.988s
sys 0m0.092s
Bash
1
2
3
4
5
6
7
8
9
10
alexxx@alexxx-laptop:~/c++$ g++ -DSTL_WAY -O3 1.cpp && time ./a.out 
 
real    0m0.325s
user    0m0.316s
sys 0m0.012s
alexxx@alexxx-laptop:~/c++$ g++ -O3 1.cpp && time ./a.out 
 
real    0m0.288s
user    0m0.284s
sys 0m0.004s
Собственно
1
В астрале
Эксперт С++
8032 / 4789 / 655
Регистрация: 24.06.2010
Сообщений: 10,558
05.11.2011, 00:21 13
Добавка.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <algorithm>
#include <vector>
#include <functional>
 
bool more_then_7(int value)
{
        return value > 7;
}
 
int main()
{
        int arr[] = {1,2,3,4,5,6,7,8,9,10};
        std::vector<int> v(arr, arr + sizeof(arr)/sizeof(arr[0]));
        for (size_t i=0;i<1e7;++i)
        {
#ifdef LAMBDA
                std::find_if(v.begin(), v.end(), [](const int value) {return value > 7;});
#else
                std::find_if(v.begin(), v.end(), std::bind(&more_then_7, std::placeholders::_1));
#endif
        }
}
Bash
1
2
3
4
5
6
7
8
9
10
11
forever@lavroffff:~/Programs$ g++ -DLAMBDA map_test.cpp -std=c++0x && time ./a.out
 
real    0m2.257s
user    0m2.152s
sys 0m0.000s
 
forever@lavroffff:~/Programs$ g++ map_test.cpp -std=c++0x && time ./a.out
 
real    0m7.950s
user    0m7.744s
sys 0m0.044s
Bash
1
2
3
4
5
6
7
8
9
10
forever@lavroffff:~/Programs$ g++ -O3 map_test.cpp -std=c++0x && time ./a.out
 
real    0m0.440s
user    0m0.416s
sys 0m0.000s
forever@lavroffff:~/Programs$ g++ -O3 -DLAMBDA map_test.cpp -std=c++0x && time ./a.out
 
real    0m0.162s
user    0m0.152s
sys 0m0.004s
2
бжни
2472 / 1681 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
05.11.2011, 00:45 14
ForEveR, ты развеял мои опасения насчет эффективности лямбд)

Добавлено через 6 минут
хотя сравнение наверно не очень корректное, в случае лямбды ты функцию в принципе не вызываешь
0
Эксперт С++
1062 / 841 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
05.11.2011, 00:52 15
По поводу поста с измерением времени. Массивчик маловат.
Попробуйте на 100 миллионах - 1 миллиард элементов
0
бжни
2472 / 1681 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
05.11.2011, 01:02 16
ValeryLaptev, это уже отдельный тест
stl'ские функторы предназначены не только для массивов миллионной размерности
0
Эксперт С++
1062 / 841 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
05.11.2011, 01:14 17
Цитата Сообщение от alex_x_x Посмотреть сообщение
ValeryLaptev, это уже отдельный тест
stl'ские функторы предназначены не только для массивов миллионной размерности
В реальных задачах не обрабатывают один маленький массив миллион раз. А вот миллионные массивы - это ближе к реальности. У меня в задаче матрица - 625 миллионов узлов.
STL-ные алгоритмы давят на векторе по скорости любые мои "доморощенные" алгоритмы. Бывает, что совсем немного, процентов на 5-7-10, но выигрывают. Осталось только на ассемблерной вставке написать - только это еще не попробовал...
0
бжни
2472 / 1681 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
05.11.2011, 01:28 18
ValeryLaptev, ну применение их общее
спор не идет об эффективности алгоритмов в связке с контейнерами(тут все и так очевидно) - речь идет об использовании адаптеров и биндеров
0
Эксперт С++
1062 / 841 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
05.11.2011, 01:59 19
Цитата Сообщение от alex_x_x Посмотреть сообщение
ValeryLaptev, ну применение их общее
спор не идет об эффективности алгоритмов в связке с контейнерами(тут все и так очевидно) - речь идет об использовании адаптеров и биндеров
Об эффективности использования, что и пытаются доказать измерениями.
Поэтому и нужно проверить на много миллионных массивах...
0
1999 / 1599 / 488
Регистрация: 31.05.2009
Сообщений: 2,990
05.11.2011, 13:11 20
Цитата Сообщение от AzaKendler Посмотреть сообщение
Я предполагаю что конструктор вызывается чтолько раз сколько объектов контейнера надо обойти, соответственно столько же раз вызовется деструктор и оператор ()()
Это так сложно проверить(чтобы убедиться, что это не так)?
Цитата Сообщение от AzaKendler Посмотреть сообщение
плюсом это все вызывается через функцию помощник.
Нет никаких функций помощников, через которые что-то там вызывается... Есть функции "редакторы связей", которые "связывают" параметр функции/функтора с определённым значение, и возвращают новый функтор. Всё это происходит до начала работы функции-алгоритма и никак не влияет на то, что будет происходить внутри.
Цитата Сообщение от AzaKendler Посмотреть сообщение
Но...разве так быстро как пишут?
Да. Все дело во встраивании.
Цитата Сообщение от AzaKendler Посмотреть сообщение
Нельзя сравнивать функцию и биндер? почему с? в этой картиночке биндер это как раз функция помощник которая генерит класс и подсовывает его в алгоритм, и уже оператор()() этого класса делает сравнение
Повторюсь, "редактор связей" не участвует в работе функции-алгоритма, в ней участвует функтор, cледовательно сравнивать можно только функтор и функцию.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.11.2011, 13:11

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Функторы, предикаты, функциональные адаптеры, лямбда-функции
Вступление Статья ориентирована на программистов С++, поверхностно знающих/желающих узнать STL,...

Сетевые адаптеры!
Есть сервер DELL R320 под управлением Windows 2008 R2 Standart. Сняли с него образ. Имеется ещё...

Адаптеры сети
Здравствуйте. Ноут asus n-series 76vb. После установки win10 начал барахлить wifi...

Адаптеры WI-FI не найдены
если ввести ip addr show то показывает lo и eth0. Никакого wlan нету. NetworkManager включен (по ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.