С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2

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

30.11.2013, 13:52. Показов 1371. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.11.2013, 13:52
Ответы с готовыми решениями:

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

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

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

6
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
02.12.2013, 13:14  [ТС]
up...
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
02.12.2013, 13:21
DiffEreD, по эффективности: std::function использует type erasure, может лезть в кучу. Зато (за счёт того же type erasure) туда можно будет передать не только указатель на функцию, а любой "вызываемый" объект с подходящей сигнатурой.

Добавлено через 1 минуту
и pointer_to_binary_function можно заменить указателем на фунцию, вроде разницы не будет никакой.
1
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
02.12.2013, 15:54
Тем, что объявлено deprecated, лучше не пользоваться, для того оно и объявлено. Эффективнее всего - то, что инлайнится без какого бы то ни было лишнего груза: функтор, лямбда, функция...
C++
1
using set_f = std::multiset<string, decltype(len)>;
1
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
02.12.2013, 16:09  [ТС]
Nick Alte, а как это использовать? У меня одни ошибки.
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
02.12.2013, 21:03
Смотря какие. Если компилятор не понимает decltype - значит, не дорос он до C++11, надо написать там что-то попривычней. Например, так:
C++
1
using set_f = std::multiset<string, bool (*)(const string&, const string&)>;
Если ошибки в инстанциации шаблона, то надо разбираться, что не нравится.
0
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
02.12.2013, 22:04  [ТС]
Заработало только с лямбдой:
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.12.2013, 22:04
Помогаю со студенческими работами здесь

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

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

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

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

Std::bind, std::mem_fun, std::mem_fn
В чем разница между функциями std::bind, std::mem_fun, std::mem_fn?


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru