Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
DiffEreD
1440 / 777 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
#1

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

30.11.2013, 13:52. Просмотров 608. Ответов 6
Метки нет (Все метки)

Какая реализация (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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2013, 13:52
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Какая реализация лучше? std::pointer_to_binary_function vs std::function (C++):

Использование std::function в std::thread - C++
Нужно вызвать function fnc в новом потоке. Как сделать? function &lt;void(vector&lt;char&gt;)&gt; fnc; void test(vector&lt;char&gt; data) { for...

Реализация класса MyString. Стандартная библиотека, std::string, std::vector - C++
как добавить реализацию конкатенации строк через перегрузку оператора &quot;+=&quot; в классе MyString и почему ошибка выдается???#include...

Std::function and std::vector - C++
Как положить обёртки в вектор? Не используя библиотеку boost. function&lt;void(int)&gt; first_func() = one(); function&lt;void(int)&gt;...

Не воспринимает ни std::cout, ни std::cin. Вобщем ничего из std. Также не понимает iostream - C++
Здравствуйте! Я хотел начать изучать язык C++. Набрал литературы. Установил Microsoft Visual C++ 2005 Express Edition. Образ диска...

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri - C++
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка error: cannot convert 'std::string {aka...

STL std::set, std::pair, std::make_pair - C++
Я не знаю как описать тему в двух словах, поэтому не обращайте внимание на название темы. Собственно перейдем к нашим баранам: есть...

6
DiffEreD
1440 / 777 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
02.12.2013, 13:14  [ТС] #2
up...
0
gray_fox
What a waste!
1552 / 1257 / 74
Регистрация: 21.04.2012
Сообщений: 2,634
Завершенные тесты: 3
02.12.2013, 13:21 #3
DiffEreD, по эффективности: std::function использует type erasure, может лезть в кучу. Зато (за счёт того же type erasure) туда можно будет передать не только указатель на функцию, а любой "вызываемый" объект с подходящей сигнатурой.

Добавлено через 1 минуту
и pointer_to_binary_function можно заменить указателем на фунцию, вроде разницы не будет никакой.
1
Nick Alte
Эксперт С++
1646 / 1018 / 120
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
02.12.2013, 15:54 #4
Тем, что объявлено deprecated, лучше не пользоваться, для того оно и объявлено. Эффективнее всего - то, что инлайнится без какого бы то ни было лишнего груза: функтор, лямбда, функция...
C++
1
using set_f = std::multiset<string, decltype(len)>;
1
DiffEreD
1440 / 777 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
02.12.2013, 16:09  [ТС] #5
Nick Alte, а как это использовать? У меня одни ошибки.
0
Nick Alte
Эксперт С++
1646 / 1018 / 120
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
02.12.2013, 21:03 #6
Смотря какие. Если компилятор не понимает decltype - значит, не дорос он до C++11, надо написать там что-то попривычней. Например, так:
C++
1
using set_f = std::multiset<string, bool (*)(const string&, const string&)>;
Если ошибки в инстанциации шаблона, то надо разбираться, что не нравится.
0
DiffEreD
1440 / 777 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
02.12.2013, 22:04  [ТС] #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;
}
Но, и на том спасибо.
0
02.12.2013, 22:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2013, 22:04
Привет! Вот еще темы с ответами:

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами - C++
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же числа, но не в виде строк, а в виде...

(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const& - C++
astxx::manager::connection::connection(std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;, unsigned short); ...

Std::function на шаблонную функцию - C++
Здравствуйте :) Делаю такую вещь: template &lt;typename T1, typename T2&gt; typename std::common_type&lt;T1,T2&gt;::type func(T1 val1, T2 val2) ...

Объединение std::function в контейнер - C++
Во многих ЯП есть делегаты. В случае с С++ у нас в распоряжении есть std::function, им можно обернуть как и обычные функции, так и лямбды с...


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

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

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