Narzędzia użytkownika

Narzędzia witryny


adjacent_find

Algorytm adjacent_find()

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

Algorytm zawarty w Standard Template Library. Funkcja adjacent_find() domyślnie przeszukuje zakres danych określony przez iteratory start, end w celu odnalezienia dwóch idendtycznych, występujących kolejno elementów zawartych w strukturze danych. Porównanie elementów dokonywane jest przez zastosowanie operator==(). Możliwe jest także dostarczenie własnej funkcji porównującej elementy. Funkcja taka pobiera 2 argumenty i zwraca wartość logiczną TRUE ( gdy elemnty są równe) w przeciwnym przypadku false;

Nagłówek

#include<alghoritm>

Definicja adjacent_find()

template <class ForwardIterator> ForwardIterator adjacent_find ( ForwardIterator first, ForwardIterator last )
{
  ForwardIterator next=first; ++next;
  if (first != last)
    while (next != last)
      if (*first++ == *next++)  // or: if (pred(*first++,*next++)), for the pred version
        return first;
  return last;
}

Parametry

  • first - iterator wskazujący początek zakresu do przeszukania
  • last - iterator wskazujący koniec zakresu do przeszukania
  • binary_pred - opcjonalny argument, wskaźnik na funkcję dokonującej porównania

Przyklady

  • Najprostsze zastosowanie algorytmu
#include<alghoritm>
 
int main() {
  vector<int> v1;
 
  for( int i = 0; i < 10; i++ ) {
    v1.push_back(i);
 
    // zmuszenie do zdublowania wartości 7 i 9
    if( i == 7 || i == 9 ) {
      v1.push_back(i);
    }
  }
 
  vector<int>::iterator result;
  result = adjacent_find( v1.begin(), v1.end() );
 
  if( result == v1.end() ) {
    cout << "Nie znaleziono dwóch identycznych kolejno występujących elemntów" << endl;
  }
  else {
    cout << "Znaleziona dwa identyczne kolejno występujące elementy. Pierwszy element: " << *result << endl;
  }
 
  result = adjacent_find (++result, v1.end());
 
  if (result == v1.end()) {
    cout << "Nie znaleziono drugiej pary identycznych kolejno występujących elementów" << endl;
  }
  else {
    cout << "Istnieje druga para identycznych kolejno występujących elementów. Pierwszy element: " << *result << std::endl;
  }
 
  return 0;
} 
  • Przykład z zastosownaniem 3 parametru algorytmu adjacent_find()
#include<alghoritm>
#include<list>
#include<iostream>
 
// sprawdza czy następny element jest 2 razy większy od obecnego
bool twice (int elem1, int elem2 )
{
   return elem1 * 2 == elem2;
}
 
 
int main() {
 
  std::list<int> L;
  std::list <int>::iterator result;
 
  L.push_back( 50 );
  L.push_back( 40 );
  L.push_back( 10 );
  L.push_back( 20 );
  L.push_back( 20 );
 
  result = std::adjacent_find( L.begin( ), L.end( ), twice );
  if ( result == L.end( ) ) {
    std::cout << "Nie występuje para kolejnych elementów, w której jeden element jest dwukrotnie większy od drugiego" << std::endl;
  }
  else {
      std::cout << "Występuje para elementów w której jeden jest 2 razy większy od drugiego" << std::endl << "Wartości tych elementów" << *(result);
      std::cout << " oraz " << *(++result) << std::endl;
  }
}

adjacent_find.cpp

adjacent_find.txt · ostatnio zmienione: 2008/12/12 18:45 przez pejotr