Extension to the STL "find_if" and "for_each" | CodeGuru

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&ltOBJECT&gt theList; class DATA { public: bool IsValid(const OBJECT& rObject) const; void OperateOn(OBJECT& rObject) const; }; bool IsValid(OBJECT theObject, DATA theData) { return theData.IsValid(theObject); } […]

Written By
CodeGuru Staff
CodeGuru Staff
Aug 6, 1998
1 minute read
CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More

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
{
public:
    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)
{
    theData.OperateOn(theObject);
}

DATA theData;

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

// CODE STARTS HERE:
/////////////////////////////////////////////////////////////////
// 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
TDfind_if(
  _II _F, // First iterator
  _II _L, // Last iterator
  _Pr _P, // Predicate: a static function that returns bool having two
paramters
  T_DATA dwData)
{
    for (; _F != _L; ++_F)
    {
        if (_P(*_F, dwData))
        {
            break;
        }
    }

    return (_F);
}


template<class _II, class _Fn, class T_DATA> inline
void
TDfor_each(
  _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.

CodeGuru Logo

CodeGuru covers topics related to Microsoft-related software development, mobile development, database management, and web application programming. In addition to tutorials and how-tos that teach programmers how to code in Microsoft-related languages and frameworks like C# and .Net, we also publish articles on software development tools, the latest in developer news, and advice for project managers. Cloud services such as Microsoft Azure and database options including SQL Server and MSSQL are also frequently covered.

Property of TechnologyAdvice. © 2026 TechnologyAdvice. All Rights Reserved

Advertiser Disclosure: Some of the products that appear on this site are from companies from which TechnologyAdvice receives compensation. This compensation may impact how and where products appear on this site including, for example, the order in which they appear. TechnologyAdvice does not include all companies or all types of products available in the marketplace.