STL Sample for Predicate Version of adjacent_find Function

Last reviewed: October 9, 1997
Article ID: Q156321
The information in this article applies to:
  • The Standard C++ Library included with: - Microsoft Visual C++, 32-bit Edition, version 4.2

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 : STLIss kbcode
Version : WINNT:4.2;
Platform : NT WINDOWS
Issue type : kbhowto


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: October 9, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.