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

  • Lenovo recommends Windows 8 Pro. "I dropped my laptop getting out of the taxi." This probably sounds familiar to most IT professionals. If your employees are traveling, you know their devices are in for a rough go. Whether it's a trip to the conference room or a convention out of town, any time equipment leaves a user's desk it is at risk of being put into harm's way. Stay connected at all times, whether at the office or on the go, with agile, durable, and flexible devices like the Lenovo® …

  • By providing developers with the right tools to detect, understand, and fix problems early, your business can simplify software development, shorten development lifecycles, and improve the quality of software code. The end result is increased innovation, secure applications, and a faster time to market — all at a lower cost.

Most Popular Programming Stories

More for Developers

RSS Feeds

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