Từ 1 tới 10 trên tổng số 10 kết quả

Đề tài: Cách bind ternary_function thành unarry_function dùng cho std::find_if ?

  1. #1
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Mặc định Cách bind ternary_function thành unarry_function dùng cho std::find_if ?

    Mấy bác xem dùng code bên dưới, em viết cái template ternary_function nhưng dùng ko đc, chẳng biết cách bind như thế nào để thành unarry_function dùng cho std::find_if cả. :-|
    C++ Code:
    1. // _________________Test.cpp : Defines the entry point for the console application.
    2. //
    3.  
    4.  
    5. #include "stdafx.h"
    6. #include <iostream>
    7. #include <string>
    8. #include <vector>
    9. #include <algorithm>
    10. namespace std
    11. {
    12.     template<class Arg1,class Arg2,class Arg3,class Result>
    13.     struct ternary_function
    14.     {
    15.         typedef Arg1 first_argument_type;
    16.         typedef Arg2 second_argument_type;
    17.         typedef Arg3 third_argument_type;
    18.         typedef Result result_type;
    19.     };
    20. };
    21. class A
    22. {
    23. public:
    24.     A(int i, int j, int k):ioF_1(i), ioF_2(j), ioF_3(k)     {std::cout<<"Ham khoi tao dc goi"<<std::endl;}
    25.     A(const A &other)   {std::cout<<"Ham tao sao chep dc goi"<<std::endl;*this = other;}
    26.     ~A()                {std::cout<<"Ham huy dc goi"<<std::endl;}
    27.     int ioF_1;
    28.     int ioF_2;
    29.     int ioF_3;
    30. };
    31.  
    32. struct functor:public std::ternary_function<int, int, A, bool>
    33. {
    34.     bool operator()(int ioF_1, int ioF_2, A a) const
    35.     {
    36.         return (ioF_1 == a.ioF_1 && ioF_2 == a.ioF_2);
    37.     }
    38. };
    39.  
    40. int _tmain(int argc, _TCHAR* argv[])
    41. {
    42.     std::vector<A> vA;
    43.     vA.push_back(A(1,2,9));
    44.     vA.push_back(A(2,4,10));
    45.     vA.push_back(A(3,6,11));
    46.     vA.push_back(A(4,8,12));
    47.     vA.push_back(A(5,10,13));
    48.  
    49.     std::vector<A>::iterator itFindA = std::find_if(vA.begin(), vA.end(), std::bind1st(std::bind1st(functor(),3),6));
    50.     if(itFindA != vA.end())
    51.         std::cout<<itFindA->ioF_1<<" "<<itFindA->ioF_2<<" "<<itFindA->ioF_3;
    52.  
    53.     std::cin.get();
    54.     return 0;
    55. }
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  2. #2
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    ~~>"<~~ Ko có cách bind thì dựa vào std mà tự tạo hàm bind vậy...
    C++ Code:
    1. // _________________Test.cpp : Defines the entry point for the console application.
    2. //
    3.  
    4.  
    5. #include "stdafx.h"
    6. #include <iostream>
    7. #include <string>
    8. #include <vector>
    9. #include <algorithm>
    10. namespace std
    11. {
    12.     //********************************************
    13.     // Written by doicanhden@gmail.com
    14.     //********************************************
    15.     template<class Arg1,class Arg2,class Arg3,class Result>
    16.     struct ternary_function
    17.     {
    18.         typedef Arg1 first_argument_type;
    19.         typedef Arg2 second_argument_type;
    20.         typedef Arg3 third_argument_type;
    21.         typedef Result result_type;
    22.     };
    23.     // TEMPLATE CLASS binder1st2nd
    24.     template<class _Fn2>
    25.     class binder1st2nd:public unary_function<typename _Fn2::third_argument_type, typename _Fn2::result_type>
    26.     {
    27.     public:
    28.         typedef unary_function<typename _Fn2::third_argument_type, typename _Fn2::result_type> _Base;
    29.         typedef typename _Base::argument_type argument_type;
    30.         typedef typename _Base::result_type result_type;
    31.         binder1st2nd(const _Fn2& _Func, const typename _Fn2::first_argument_type& _Left1,const typename _Fn2::second_argument_type& _Left2)
    32.             :op(_Func), value1(_Left1), value2(_Left2)
    33.         {   // construct from functor and left operand
    34.         }
    35.         result_type operator()(const argument_type& _Right) const
    36.         {   // apply functor to operands
    37.             return (op(value1, value2, _Right));
    38.         }
    39.        
    40.         result_type operator()(argument_type& _Right) const
    41.         {   // apply functor to operands
    42.             return (op(value1, value2, _Right));
    43.         }
    44.     protected:
    45.         _Fn2 op;    // the functor to apply
    46.         typename _Fn2::first_argument_type value1;  // the left operand
    47.         typename _Fn2::second_argument_type value2; // the left operand
    48.     };
    49.    
    50.     // TEMPLATE FUNCTION bind1st2nd
    51.     template<class _Fn2, class _Ty1, class _Ty2>
    52.     inline binder1st2nd<_Fn2> bind1st2nd(const _Fn2& _Func, const _Ty1& _Left1,const _Ty2& _Left2)
    53.     {   // return a binder1st functor adapter
    54.         typename _Fn2::first_argument_type _Val1(_Left1);
    55.         typename _Fn2::second_argument_type _Val2(_Left2);
    56.         return (_STD binder1st2nd<_Fn2>(_Func, _Val1, _Val2));
    57.     }
    58. };
    59. class A
    60. {
    61. public:
    62.     A(int i, int j, int k):ioF_1(i), ioF_2(j), ioF_3(k)     {std::cout<<"Ham khoi tao dc goi"<<std::endl;}
    63.     A(const A &other)   {std::cout<<"Ham tao sao chep dc goi"<<std::endl;*this = other;}
    64.     ~A()                {std::cout<<"Ham huy dc goi"<<std::endl;}
    65.     int ioF_1;
    66.     int ioF_2;
    67.     int ioF_3;
    68. };
    69.  
    70. struct functor:public std::ternary_function<int, int, A, bool>
    71. {
    72.     bool operator()(int ioF_1, int ioF_2, A a) const
    73.     {
    74.         return (ioF_1 == a.ioF_1 && ioF_2 == a.ioF_2);
    75.     }
    76. };
    77.  
    78. int _tmain(int argc, _TCHAR* argv[])
    79. {
    80.     std::vector<A> vA;
    81.     vA.push_back(A(1,2,9));
    82.     vA.push_back(A(2,4,10));
    83.     vA.push_back(A(3,6,11));
    84.     vA.push_back(A(4,8,12));
    85.     vA.push_back(A(5,10,13));
    86.  
    87.     std::vector<A>::iterator itFindA = std::find_if(vA.begin(), vA.end(), std::bind1st2nd(functor(),3,6));
    88.     if(itFindA != vA.end())
    89.         std::cout<<itFindA->ioF_1<<" "<<itFindA->ioF_2<<" "<<itFindA->ioF_3;
    90.  
    91.     std::cin.get();
    92.     return 0;
    93. }
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  3. #3
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Sao giống tự sướng quá vậy cà. @@~
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  4. #4
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Ở code thứ 2 nếu xoá _STD thì chạy ngon. Có vấn đề gì không ?

  5. #5
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Trích dẫn Nguyên bản được gửi bởi boss14420 Xem bài viết
    Ở code thứ 2 nếu xoá _STD thì chạy ngon. Có vấn đề gì không ?
    @@~ ừhm nhỉ ko để ý chỗ đó, nhưng để vậy vẫn chạy đc, trừ khi tách hoàn toàn khỏi STD.
    Nãy lúc nhờ bác là em chưa tìm ra cách giải quyết, giờ thì đc rồi. Nhưng lại có thêm câu hỏi khác, hỏi ở đây luôn nhé.

    Vd ta có std::list<A*> thì bây giờ làm như thế nào để quyệt toàn bộ list, giải phóng item nếu thỏa 1 điều kiện vào đó. Định dùng for và iterator nhưng có vẻ cầu kì, không dùng lại đc. Nếu dùng functor thì đc ko? for_each?
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  6. #6
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Mặc định Cách bind ternary_function thành unarry_function dùng cho std::find_if ?

    Dùng iterator cũng được.
    list có hàm remove_if nhưng chỉ xoá phần tử chứ không delete nếu nó là con trỏ. Ta có thể sửa lại một chút:
    C++ Code:
    1. template <typename List, typename ForwardIterator, typename Predicate>
    2. void remove_delete_if(List l, ForwardIterator first, ForwardIterator last, Predicate pred)
    3. {
    4.     while (first != last)
    5.     {
    6.         ForwardIterator next = first;
    7.         ++next;
    8.         if (pred(*first)) {
    9.             delete *first;
    10.             l.erase(first);
    11.         }
    12.         first = next;
    13.     }
    14. }

    Nhưng mà nếu đụng đến con trỏ trong những trường hợp thế này thì tốt hơn hết là dùng shared_ptr. Khi dùng hàm list::remove_if thì nó cũng sẽ tự động giải phóng bộ nhớ.
    Đã được chỉnh sửa lần cuối bởi boss14420 : 19-02-2012 lúc 07:40 PM.

  7. #7
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Em dùng std::remove_if với functor có chức năng tìm kiếm và delete luôn. Bác boss14420 có tài liệu về các loại smart pointer thì chia sẻ cho em với, vì cái shared_ptr em chưa dùng lần nào cả, thấy còn hơi lạ.
    cái smart pointer dùng như vầy à?
    C++ Code:
    1. // _________________Test.cpp : Defines the entry point for the console application.
    2. //
    3.  
    4.  
    5. #include "stdafx.h"
    6. #include <iostream>
    7. #include <string>
    8. #include <list>
    9. #include <algorithm>
    10. #include <functional>
    11. //#include <DLib_std.h>
    12. typedef class _A
    13. {
    14. public:
    15.     _A(int i, int j, int k):ioF_1(i), ioF_2(j), ioF_3(k)        {std::cout<<"Ham khoi tao dc goi"<<std::endl;}
    16.     _A(const _A &other) {std::cout<<"Ham tao sao chep dc goi"<<std::endl;*this = other;}
    17.     ~_A()               {std::cout<<"Ham huy dc goi"<<std::endl;}
    18.     int ioF_1;
    19.     int ioF_2;
    20.     int ioF_3;
    21. }A,*PA;
    22.  
    23. struct functor:public std::ternary_function<int, int, std::shared_ptr<A>, bool>
    24. {
    25.     bool operator()(int ioF_1, int ioF_2, std::shared_ptr<A> a) const
    26.     {
    27.         return (ioF_1 == a->ioF_1 && ioF_2 == a->ioF_2);
    28.     }
    29. };
    30. int _tmain(int argc, _TCHAR* argv[])
    31. {
    32. /*  std::list<PA> vA;
    33.     vA.push_back(new A(1,2,9));
    34.     vA.push_back(new A(2,4,10));
    35.     vA.push_back(new A(3,6,11));
    36.     vA.push_back(new A(4,8,12));
    37.     vA.push_back(new A(5,10,13));
    38.     */
    39.     std::list< std::shared_ptr<A> > lstPtrA;
    40.     lstPtrA.push_back(std::shared_ptr<A>(new A(1,2,9)));
    41.     lstPtrA.push_back(std::shared_ptr<A>(new A(2,4,10)));
    42.     lstPtrA.push_back(std::shared_ptr<A>(new A(3,6,11)));
    43.     lstPtrA.push_back(std::shared_ptr<A>(new A(4,8,12)));
    44.     lstPtrA.push_back(std::shared_ptr<A>(new A(5,10,13)));
    45.    
    46.     std::list<std::shared_ptr<A>>::iterator itFindA = std::find_if(lstPtrA.begin(), lstPtrA.end(), std::bind1st2nd(functor(),3,6));
    47.  
    48.     if(itFindA != lstPtrA.end())
    49.         std::cout<<(*itFindA)->ioF_1<<" "<<(*itFindA)->ioF_2<<" "<<(*itFindA)->ioF_3;
    50.  
    51.     lstPtrA.remove_if(std::bind1st2nd(functor(),3,6));
    52.  
    53.     std::cin.get();
    54.     return 0;
    55. }
    Đã được chỉnh sửa lần cuối bởi doicanhden : 20-02-2012 lúc 12:12 AM.
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  8. #8
    Ngày gia nhập
    11 2010
    Bài viết
    589

    std::smart_ptr vốn từ boost mà ra nên xem tài liệu của boost cũng được: http://www.boost.org/doc/libs/1_48_0...shared_ptr.htm

  9. #9
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Tks bác, đi đâu cũng nghe nói về thư viện boost nhưng chưa xài thử bao giờ, trung thành với STL hơn. Bác cũng thức khuya nhỉ?
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  10. #10
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Trích dẫn Nguyên bản được gửi bởi doicanhden Xem bài viết
    Tks bác, đi đâu cũng nghe nói về thư viện boost nhưng chưa xài thử bao giờ, trung thành với STL hơn.
    Pác nên dùng boost đi, thực tế có thể coi boost là phần tiên phong của STL. Rất nhiều các thư viện trong boost đã và đang, và sẽ được đưa vào STL. Bản thân cái shared_ptr cũng vậy, đã xuất hiện trong boost từ rất lâu mà mới được đưa vào stl

    Về mấy cái hàm bind của pác thì boost đã có hết từ lâu rồi pác có thể search boost.bind (rất mạnh) và boost.lambda (cực kỳ mạnh > )
    Ngoài ra còn các container (giống y như std::list, std::vector..) mà dùng được luôn cho các con trỏ đó.

Các đề tài tương tự

  1. Tư vấn về việc bind dữ liệu trong asp.net.
    Gửi bởi resazip trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 4
    Bài viết cuối: 26-06-2013, 11:32 PM
  2. Phân biệt khi nào dùng Eval và Bind
    Gửi bởi dnhattan trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 1
    Bài viết cuối: 12-03-2011, 09:30 AM
  3. bind dữ liệu datatable ta dropdown
    Gửi bởi r3z0lee trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 1
    Bài viết cuối: 21-05-2010, 04:09 PM
  4. C# lỗi: Cannot bind to the property or column ...
    Gửi bởi tranhaonam_caption trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 7
    Bài viết cuối: 02-04-2010, 10:35 PM
  5. Lỗi hiện dialog.Và hàm bind
    Gửi bởi laogia_2588 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 0
    Bài viết cuối: 12-04-2009, 11:32 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn