Связывающие адаптеры это классы, которые позволяют использовать двухаргументные (бинарные) функциональные объекты как одноаргументные (унарные) путем связывания (binding) одного из аргументов со значением .
От нам допустим нужно написать предикат — проверки чисел которые меньше допустим семи. Мы должны свой предикат определить. Щас попробуем это сделать. От мы определили свой собственный функтор.
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 26 27 28 29 30 |
#include <iostream> using std::cout; using std::endl; #include <vector> using std::vector; #include <algorithm> using std::find_if; //функтор struct obj { int d; explicit obj(int a):d(a){} bool operator()(int a){return (d>a);} }; int main() { vector<int> v; for(int i=0;i<10;i++) v.push_back(i); vector<int>::iterator it; it=find_if(v.begin(),v.end(),obj(7)); cout <<"*it= "<<*it<<endl; return 0; } |
Но библиотека СТЛ предлагает нам свои собственные средства для этого, щас попробуем переделать примерчик с использованием средств СТЛ.
А от мы это сделали с помощью средств СТЛ
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 26 27 |
#include <iostream> using std::cout; using std::endl; #include <vector> using std::vector; #include <algorithm> using std::find_if; #include <functional> using std::bind2nd; using std::less; int main() { vector<int> v; for(int i=0;i<10;i++) v.push_back(i); vector<int>::iterator it; //делаем поиск по предикату it=find_if(v.begin(),v.end(),bind2nd(less<int>(),7)); //вывод результата поиска if(it!=v.end()) cout <<"*it= "<<*it<<endl;//0 return 0; } |
Примерчик явно наглядно показывает что как делать. Мне конечно не охота их все переписывать там их несколько bind2nd это фигня которая делает из двух аргументного функционального объекта одноаргументный, это как мы заметили он просто на место второго аргумента подставляет цифру 7.
Есть еще bind1nd эта фигня уже из одноаргументного функтора делает двухаргументный. От подумываю разобрать его что ли, честно я с ними не сталкивался. Да наверно лучше разобрать все эти связывающие адаптеры для полноты картины или создать раздел, где будут разобраны все адаптеры с примером использования каждого из них. Ну наверно так и сделаю, токо не щас, щас мне как то не сильно охота этим заниматся, да и вообще наверно нужно весь functional рассмотреть более подробно.
[youtube]http://www.youtube.com/watch?v=ouKj-7bc-ZQ[/youtube]