adjacent_find |
C++ Library |
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.
// 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 ; }
IntArray { 1, 2, 3, 4, 4, 5, 6, 7, } Found adjacent pair of matching elements: (4, 4), at location 3
// 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[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 ; }
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