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

  • As the mobile enterprise marketplace expands and customer needs grow more diverse, Samsung recognizes that solution partners and developers play an essential role by continually innovating to meet their customers' needs. Samsung works to provide these developers and partners with the latest tools and resources needed to create these solutions. Read this program guide to learn how the Samsung Enterprise Alliance Program provides partners and developers with Samsung enterprise software development kits (SDKs) …

  • 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