STL Sample for Predicate Version of adjacent_find Function

ID: Q156321

The information in this article applies to:

SUMMARY

The sample code below illustrates how to use the predicate version of adjacent_find STL function in Visual C++.

MORE INFORMATION

Required Header

   <algorithm>

Prototype

   template<class ForwardIterator, class BinaryPredicate> inline
      ForwardIterator adjacent_find(ForwardIterator first,
                                           ForwardIterator last,
                                           BinaryPredicate binary_pred) ;

NOTE: The class/parameter names in the prototype do not match the version in the header file. Some have been modified to improve readability.

Description

The adjacent_find algorithm finds consecutive pairs of matching elements in a sequence. adjacent_find returns an iterator referencing the first consecutive matching element in the range [first, last), or last if there are no such elements.

Comparison is done using the binary_pred function in this version of the algorithm. The binary_pred function can be any user-defined function. You could also use one of the binary function objects provided by STL.

Sample Code

////////////////////////////////////////////////////////////////////// 
// 
// Compile options needed: /GX
// 
// adfind.cpp : Illustrates how to use the predicate version of
//              adjacent_find function.
// 
// Functions:
// 
//   adjacent_find  - Locate a consecutive sequence in a range.
// 
// Written by Kalindi Sanghrajka
// of Microsoft Product Support Services,
// Software Core Developer Support.
// Copyright (c) 1996 Microsoft Corporation. All rights reserved.
////////////////////////////////////////////////////////////////////// 

// disable warning C4786: symbol greater than 255 character,
// okay to ignore
#pragma warning(disable: 4786)

#include <iostream>
#include <algorithm>
#include <functional>
#include <string>
#include <vector>

void main()
{
    const int VECTOR_SIZE = 5 ;

    // Define a template class vector of strings
    typedef vector<string, allocator<string> > StringVector ;

    //Define an iterator for template class vector of strings
    typedef StringVector::iterator StringVectorIt ;

    StringVector NamesVect(VECTOR_SIZE) ;   //vector containing names

    StringVectorIt location ;   // stores the position for the
                                 // first pair of matching
                                 // consecutive elements.

    StringVectorIt start, end, it ;

    // Initialize vector NamesVect
    NamesVect[0] = "Aladdin" ;
    NamesVect[1] = "Jasmine" ;
    NamesVect[2] = "Mickey" ;
    NamesVect[3] = "Minnie" ;
    NamesVect[4] = "Goofy" ;

    start = NamesVect.begin() ;   // location of first
                                  // element of NamesVect

    end = NamesVect.end() ;       // one past the location
                                  // last element of NamesVect

    // print content of NamesVect
    cout << "NamesVect { " ;
    for(it = start; it != end; it++)
        cout << *it << ", " ;
    cout << " }\n" << endl ;

    // Find the first name that is lexicographically greater
    // than the following name in the range [first, last + 1).
    // This version performs matching using binary predicate
    // function greater<string>
    location = adjacent_find(start, end, greater<string>()) ;

    // print the first pair of strings such that the first name is
    // lexicographically greater than the second.
    if (location != end)
        cout << "(" << *location << ", " << *(location + 1) << ")"
        << " the first pair of strings in NamesVect such that\n"
        << "the first name is lexicographically greater than"
        << "the second\n" << endl ;
    else
        cout << "No consecutive pair of strings found such that\n"
        << "the first name is lexicographically greater than "
        << "the second\n" << endl ;

}

Program Output is:

NamesVect { Aladdin, Jasmine, Mickey, Minnie, Goofy, }

(Minnie, Goofy) the first pair of strings in NamesVect such that the first name is lexicographically greater than the second

REFERENCES

Visual C++ Books On Line: Visual C++ Books:C/C++:Standard C++ Library Reference.

Additional query words: STL adjacent_find kbdss

Keywords          : kbcode STLIss 
Version           : WINNT:4.2;
Platform          : NT WINDOWS
Issue type        : kbhowto

Last Reviewed: October 10, 1997