boost::lambdaã«ã¤ãã¦
boost::lambdaã¯C++ã§lambda expressionãå¯è½ã«ãã¦ãããï¼ãªãã¨ãããéå¸¸ã«æ°æã¡æªããªããï¼å¼·åä¸ã¤ä¾¿å©ãªãã®ã§ãï¼
è¨æ³ã«ã¤ãã¦ã¯ï¼boostã®ãã¼ã¸ï¼http://www.boost.org/doc/libs/1_35_0/doc/html/lambda.htmlï¼èªåã¯ä½ãèªãã§ã¾ãããâ¦ï¼ï¼ã«è©³ããæ¸ãã¦ããã¾ããï¼æ¬¡ã®ããã«èª¬æããããã¨ãå¤ãããã§ãï¼
#include <iostream> #include <algorithm> #include <iterator> #include <boost/lambda/lambda.hpp> using namespace boost::lambda; int main() { int a[5] = {1, 2, 3, 4, 5}; std::for_each(a, a+5, _1*=_1); std::copy(a, a+5, std::ostream_iterator<int>(std::cout, " ")); return 0; } // åºåï¼ 1 4 9 16 25
â¦ï¼ä½ãè¨ã£ã¦ãã®ãããããã¼ã¨ï¼ä»¥ä¸ç¥ï¼ï¼ã£ã¦æãã§ãããï¼
ä¸èº«ã¨ãã¦ã¯lambda functorãè¿ãå·§å¦ãªä»çµã¿ã¨ãªã£ã¦ãã¾ãï¼ã¤ã¾ãåæ¼ç®åããªã¼ãã¼ãã¼ãããã¦ããã®ã§ï¼_1*_1ãªã©ãè¡ãã°è¿ãå¤ã¨ãã¦lambda functorãè¿ã£ã¦ããããã§ãï¼å¯¾ãã¦ï¼æ¬¡ã®ãããªã³ã¼ãã¯ã¨ã©ã¼ã¨ãªãã¾ãï¼
double a[5] = {1, 2, 3, 4, 5}; std::for_each(a, a+5, _1=sin(_1)); // 'sin' : 3 ãªã¼ãã¼ãã¼ãã®ã©ããããã¹ã¦ã®å¼æ°ã®åã夿ã§ãã¾ããã§ãã
ããã¯ï¼boost::lambda::bindãç¨ããã¨è§£æ±ºã§ãã¾ãï¼
double (*pSin)(double) = &sin; std::for_each(a, a+5, _1 = bind(pSin, _1));
sinãç´æ¥æ¸ãã¨ã¨ã©ã¼ã«ãªã£ã¦ãã¾ãã®ã¯ã¡ãã£ã¨é¢åã§ããï¼bindããã°é¢æ°åæãåºæ¥ãã¨æãã¨ï¼ã¡ãã£ã¨æ°å¤è¨ç®æ´»ç¨ã¸åããæå¾ ãæ¹§ãã¦ãã¾ãï¼â»1ï¼ï¼
#include <iostream> #include <cmath> #include <algorithm> #include <iterator> #include <boost/function.hpp> #include <boost/lambda/lambda.hpp> #include <boost/lambda/bind.hpp> using namespace boost::lambda; int main() { double a[5] = {1.0, 2.0, 3.0, 4.0, 5.0}; double (*pSin)(double) = &sin; double (*pCos)(double) = &cos; boost::function<double(double)> f = bind(pSin, _1) * bind(pCos, _1); std::transform(a, a+5, a, f); std::copy(a, a+5, std::ostream_iterator<double>(std::cout, " ")); return 0; }
boost::lambdaãç¨ããç©åè¨ç®
åç½®ããé·ããªãã¾ãããï¼C++ã§ããã·ã³ãã«ã«ç©åè¨ç®ãè¡ããªããã¨æãï¼å®è£ ãè¡ã£ã¦ã¿ã¾ããï¼ç©åã¯ï¼é«æ ¡ã®ã¨ãã«ãç¿ã£ãããããã¾ãããï¼æ¬¡ã®å¼ã§è¿ä¼¼ãããã¨ãåºæ¥ã¾ãï¼
ï¼ãã ãï¼
ããããªããæ¬å¼ã¯èª¤å·®ã大ããï¼ä¾ãã°f(x) = x, a = 0, b = 5, N = 5ã¨ããã¨ãï¼æ¬æ¥ã¯ 5 * 5 / 2 = 12.5 ã«ãªã£ã¦æ¬²ããã¨ãããï¼10ã«ãããªãã¾ããï¼N = 10ã«ãã¦ãï¼11.25ã§ããï¼1/Nã§ãã誤差ãå°ãããªãã¾ããï¼Nã10000ã¨ã100000ã¸æã£ã¦ãããã°è¯ãã®ã§ããï¼ã³ã¹ããèããã¨ããã¾ã§å¤§ããã¯åºæ¥ã¾ããï¼
ããã§ï¼ãã·ã³ãã½ã³ã®ç©åå
¬å¼ãï¼â»2ï¼ãç¨ãã¾ãï¼ããã¯ï¼kã§åç
§ãã¦ããè¦ç´ ã¨k+1/2ï¼k+1ãããããéã¿ä»ããã¦è¶³ããã®ã§ãï¼
ã§ã¯ï¼ãããå®è£ ããç©å颿°integralãå®è£ ãã¦ã¿ã¾ãï¼
/* @brief çééãã¯ãã«ãã»ãã @param[out] y ä»£å ¥çµæãæ ¼ç´ãã夿° @param[in] first ä¸é @param[in] end ä¸é @param[in] div ã»ããããç·ãã¼ã¿æ°ï¼ä¸éãä¸éã¾ã§ã®å岿°ï¼ */ template <class T, template <class A, class Allocator = std::allocator<A> > class Container> void makeVector(Container<T> &x, const T first, const T end, const int div) { if (div <= 0) { std::cout << "Error! div <= 0 (@setVector)" << std::endl; } for (int i=0; i<=div; i++) { x.push_back(first + ((end - first)*(T)i)/(T)div); } } /* @brief ãã¡ã³ã¯ã¿ãç¨ããä»£å ¥ @param[out] y ä»£å ¥çµæãæ ¼ç´ãã夿° @param[in] x ä»£å ¥ã«ç¨ãã弿° @param[in] func y=func(x) */ template <class T, template <class A, class Allocator = std::allocator<A> > class Container, typename Functor> void setVector(Container<T> &y, Container<T> &x, Functor func) { y.clear(); std::transform(x.begin(), x.end(), std::back_inserter(y), func); } /* @brief ç©åè¨ç® @param[in] from ç©åç¯å²ï¼ä¸ï¼ @param[in] to ç©åç¯å²ï¼ä¸ï¼ @param[in] integrand 被ç©å颿°ãã¡ã³ã¯ã¿ @param[in] N å岿° */ template <class T, typename Functor> T integral(const T from, const T to, Functor integrand, const int div = 100) { // N const int N = div*2; // ?x const T dx = (to - from) * 2 / N; // x, y std::vector<T> x, y; makeVector(x, from, to, N); setVector(y, x, integrand); // çµæ T res = 0; int i = 0; while (i < N) { res += dx/6 * (y[i] + 4*y[i+1] + y[i+2]); i+=2; } return res; }
ã§ã¯ï¼ãããå®è¡ãã¦ã¿ã¾ãï¼
double res; res = integral(0.0, pi, bind(sin, _1)); std::cout << res << std::endl; // 2 res = integral(0.0, pi, bind(cos, _1)); std::cout << res << std::endl; // 1.45717e-016
ãªããªãè¯ãããã§ããï¼
ã²ã¨ã¤æ°ã«ãªãã®ãï¼ãªããsin, cosããã®ã¾ã¾ã§ã³ã³ãã¤ã«éãã¨ãããã¨ã§ããâ¦ï¼
追è¨
cmathãã¤ã³ã¯ã«ã¼ãããã¨ãã«ï¼stdåå空éã®ä¸ã«ã¯ï¼ãªã¼ãã¼ãã¼ããããstd::sinã3種é¡ããã¾ãï¼
ããããªãã
using namespace std;
ããã¨ï¼ãªãã
double sin(double X)
ã®ã¿ã«ãªãã¾ãï¼â¦ãªãï¼ã¡ãªã¿ã«Visual Studio 2008ã®ã¤ã³ããªã»ã³ã¹ã§ç¢ºèªï¼
åèãµã¤ã
â»1 http://d.hatena.ne.jp/Cryolite/20040907
boost::functionã®ã³ã¼ããåèã«ããã¦é ãã¾ããï¼ã¨ãããï¼ããããboost::functionããã®ã¨ã³ããªã¼ã§ç¥ãã¾ããï¼æè¬ã§ãï¼
â»2 http://letsphysics.blog17.fc2.com/blog-entry-241.html
é·æ¹å½¢è¿ä¼¼ã®èª¤å·®ã大ããå°ã£ã¦ããéã«ãã·ã³ãã½ã³ã®ç©åå
¬å¼ããåèã«ããã¦é ãã¾ãã