Adjacent find algorithm finds consecutive pairs of matching elements in a sequence.

Adjacent find algorithm finds consecutive pairs of matching elements in a sequence.

<algorithm>

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

The adjacent_find algorithm finds consecutive pairs of matching elements in a sequence. The adjacent_find algorithm 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 operator== in this non-predicate version of the algorithm.

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

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.

Samples
Sample for Non-Predicate Version

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

#include <algorithm>
#include <iostream>

using namespace std;

void main()
{
const int ARRAY_SIZE = 8 ;
int IntArray[ARRAY_SIZE] = { 1, 2, 3, 4, 4, 5, 6, 7 } ;

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

int i ;

// print content of IntArray
cout << "IntArray { " ;
for(i = 0; i < ARRAY_SIZE; i++)
cout << IntArray[i] << ", " ;
cout << " }" << endl ;

// Find the first pair of matching consecutive elements
// in the range [first, last + 1)
// This version performs matching using operator==
location = adjacent_find(IntArray, IntArray + ARRAY_SIZE) ;

//print the matching consecutive elements if any were found
if (location != IntArray + ARRAY_SIZE)  // matching consecutive
// elements found
cout << "Found adjacent pair of matching elements: ("
<< *location << ", " << *(location + 1) << "), " <<
"at location " << location - IntArray << endl;
else         // no matching consecutive elements were found
cout << "No adjacent pair of matching elements were found"
<< endl ;

}

Program Output

IntArray { 1, 2, 3, 4, 4, 5, 6, 7,  }
Found adjacent pair of matching elements: (4, 4), at location 3

Sample for Predicate Version

// 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>

using namespace std;

void main()
{
const int VECTOR_SIZE = 5 ;

// Define a template class vector of strings
typedef vector<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 = "Jasmine" ;
NamesVect = "Mickey" ;
NamesVect = "Minnie" ;
NamesVect = "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

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