Форум программистов, компьютерный форум CyberForum.ru

Какая реализация лучше? std::pointer_to_binary_function vs std::function - C++

Восстановить пароль Регистрация
 
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
30.11.2013, 13:52     Какая реализация лучше? std::pointer_to_binary_function vs std::function #1
Какая реализация (set_p или set_f) лучше /современнее / эффективнее ? pointer_to_binary_function в С++11 объявлен как deprecated. Правильно ли я передаю предикат len в конструкторе для объекта set2?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <vector>
#include <set>
 
using std::string;
using set_p = std::multiset<string, std::pointer_to_binary_function<const string&, const string&, bool>>;
using set_f = std::multiset<string, std::function<bool(const string&, const string&)>>;
 
bool len(const string& x, const string& y)
{
   return x.size() < y.size();
}
 
int main()
{
   std::vector<string> words{"freedom", "tree", "fox", "green", "less"};
 
   set_p set1(words.begin(), words.end(), std::ptr_fun(len));   
   set_f set2(words.begin(), words.end(), len);
 
   //for (auto& i : set1) std::cout << i << "\n";
   //for (auto& i : set2) std::cout << i << "\n";
 
   return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
02.12.2013, 13:14  [ТС]     Какая реализация лучше? std::pointer_to_binary_function vs std::function #2
up...
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
02.12.2013, 13:21     Какая реализация лучше? std::pointer_to_binary_function vs std::function #3
DiffEreD, по эффективности: std::function использует type erasure, может лезть в кучу. Зато (за счёт того же type erasure) туда можно будет передать не только указатель на функцию, а любой "вызываемый" объект с подходящей сигнатурой.

Добавлено через 1 минуту
и pointer_to_binary_function можно заменить указателем на фунцию, вроде разницы не будет никакой.
Nick Alte
Эксперт С++
1561 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,896
Завершенные тесты: 1
02.12.2013, 15:54     Какая реализация лучше? std::pointer_to_binary_function vs std::function #4
Тем, что объявлено deprecated, лучше не пользоваться, для того оно и объявлено. Эффективнее всего - то, что инлайнится без какого бы то ни было лишнего груза: функтор, лямбда, функция...
C++
1
using set_f = std::multiset<string, decltype(len)>;
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
02.12.2013, 16:09  [ТС]     Какая реализация лучше? std::pointer_to_binary_function vs std::function #5
Nick Alte, а как это использовать? У меня одни ошибки.
Nick Alte
Эксперт С++
1561 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,896
Завершенные тесты: 1
02.12.2013, 21:03     Какая реализация лучше? std::pointer_to_binary_function vs std::function #6
Смотря какие. Если компилятор не понимает decltype - значит, не дорос он до C++11, надо написать там что-то попривычней. Например, так:
C++
1
using set_f = std::multiset<string, bool (*)(const string&, const string&)>;
Если ошибки в инстанциации шаблона, то надо разбираться, что не нравится.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2013, 22:04     Какая реализация лучше? std::pointer_to_binary_function vs std::function
Еще ссылки по теме:

Как искать по std::vecotr из std::pait по одному значению из пары? C++
C++ Стандартный поток и STL (std::copy to std::cout)
C++ Std::function на шаблонную функцию

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

Или воспользуйтесь поиском по форуму:
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
02.12.2013, 22:04  [ТС]     Какая реализация лучше? std::pointer_to_binary_function vs std::function #7
Заработало только с лямбдой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
#include <vector>
#include <set>
 
using std::string;
 
auto func = [](const string& x, const string& y)
{
   return x.size() < y.size();
};
 
using my_set = std::multiset<string, decltype(func)>;
 
int main()
{
   std::vector<string> words{"freedom", "tree", "fox", "green", "less"};
   my_set set(words.begin(), words.end(), func);
 
   for (auto& i : set) std::cout << i << "\n";
 
   return 0;
}
Но, и на том спасибо.
Yandex
Объявления
02.12.2013, 22:04     Какая реализация лучше? std::pointer_to_binary_function vs std::function
Ответ Создать тему
Опции темы

Текущее время: 06:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru