Extension to the STL "find_if" and "for_each"

The stl algorithms for_each and find_if are inadequate when you need more data for the predicate. Here are two new algorithms TDfind_if and TDfor_each which solve that problem.
To use:

std::list<OBJECT> theList;

class DATA
    bool IsValid(const OBJECT& rObject) const;
    void OperateOn(OBJECT& rObject) const;

bool IsValid(OBJECT theObject, DATA theData)
    return theData.IsValid(theObject);

void DoOperation(OBJECT theObject, DATA theData)

DATA theData;

OBJECT theObject = ::TDFind_if(theList.begin(), theList.end(), IsValid, theData);
::TDfor_each(theList.begin(), theList.end(), DoOperation, theData);

// This is like the Standard c++ algorithm find_if, but it takes a second parameter
template<class _II, class _Pr, class T_DATA> inline 
  _II _F, // First iterator
  _II _L, // Last iterator
  _Pr _P, // Predicate: a static function that returns bool having two
  T_DATA dwData)
    for (; _F != _L; ++_F)
        if (_P(*_F, dwData))

    return (_F);

template<class _II, class _Fn, class T_DATA> inline
  _II _F,
  _II _L,
  _Fn _Op,
  T_DATA dData)
    for (; _F != _L; ++_F)
        _Op(*_F, dData);

Date Posted: 5/4/98
Posted by: Pat Laplante.


  • mayyouhelpme

    Posted by Legacy on 11/03/2002 12:00am

    Originally posted by: tangsilai

    I am a new man in this aspect, And I want some comments of your how to use c++ freely.I am too sad to found it is to hard to learn.Help me please!!

  • Even plainer STL

    Posted by Legacy on 08/13/1999 12:00am

    Originally posted by: Dana P'Simer

    The following code shows how to use just STL to implement
    the exact same functionality without the use of custom
    implementations of find_if and for_each, custom function
    objects, or custom adapter objects. It uses std::bind1st
    and std::mem_fun1 to call the memeber functions of DATA
    with the OBJECT as an argument.

    #include <list>
    #include <algorithm>
    #include <iostream>

    typedef int OBJECT;

    std::list<OBJECT> theList;

    class DATA
    bool IsValid(OBJECT rObject) { return rObject == 5; }
    int OperateOn(OBJECT rObject) { std::cout << rObject << std::endl; return 0; }

    int main(int argc, char* argv[])
    DATA theData;

    // fill the list
    for( OBJECT i = 0; i < 10; i++ )

    // find the 5
    std::cout << "The results of find_if:" << std::endl;
    OBJECT theObject = *std::find_if(theList.begin(), theList.end(), std::bind1st(std::mem_fun1(DATA::IsValid),&theData) );
    std::cout << theObject << std::endl;

    // print the list
    std::cout << "The results of for_each:" << std::endl;
    std::for_each(theList.begin(), theList.end(), std::bind1st(std::mem_fun1(DATA::OperateOn),&theData));

    char c;
    std::cin >> c;
    return 0;

  • Plain STL

    Posted by Legacy on 10/27/1998 12:00am

    Originally posted by: Ithier de Lestrange

    You do not need to rewrite the find_if and for_each algorithms to have more arguments. You just need to use a
    struct (and the operator() function) as shown below:

    struct ex : public std::unary_function<OBJECT&, void>
    ex (short Param1, bool Param2) :
    n_Param1(Param1), b_Param2 (Param2)
    void operator() (OBJECT& x)
    x.Function1 (m_Param1, b_param2);

    int n_Param1;
    bool b_Param2;

    std::list<OBJECT> TheList;

    std::for_each (TheList.begin(), TheList.end(), ex(3, false));

    At http://www.sgi.com/Technology/STL/ you can find a very good documentation about STL.

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Enterprises are increasingly looking to platform as a service (PaaS) to lower their costs and speed their time to market for new applications. Developing, deploying, and managing applications in the cloud eliminates the time and expense of managing a physical infrastructure to support them. PaaS offerings must deliver additional long-term benefits, such as a lower total cost of ownership (TCO), rapid scalability, and ease of integration, all while providing robust security and availability. This report …

  • Moving from an on-premises environment to Office 365 does not remove the need to plan for disruptions or reduce the business risk requirements for protecting email services. If anything, some risks increase with a move to the cloud. Read how to ease the transition every business faces if considering or already migrating to cloud email. This white paper discusses: Setting expectations when migrating to Office 365 Understanding the implications of relying solely on Exchange Online security Necessary archiving …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date