std::find_end en C++

std::find_end se usa para encontrar la última aparición de una subsecuencia dentro de un contenedor. Busca en el rango [first1,last1) la última ocurrencia de la secuencia definida por [first2,last2) y devuelve un iterador a su primer elemento, o last1 si no se encuentran ocurrencias.

Es similar a std::search de tal manera que en std::search buscamos la primera aparición de una subsecuencia dentro de otro contenedor, mientras que en std::find_end buscamos la última aparición de dicha subsecuencia. -secuencia, y devuelve un iterador al primer elemento si se encuentra dicha subsecuencia.

Se puede utilizar de dos formas como se muestra a continuación:

  1. Comparando elementos usando ==:

    Sintaxis:

    Template
       ForwardIterator1 find_end (ForwardIterator1 first1, ForwardIterator1 last1,
                                  ForwardIterator2 first2, ForwardIterator2 last2);
    
    first1: Forward iterator to the first element in the first range.
    last1: Forward iterator to the last element in the first range.
    first2: Forward iterator to the first element in the second range.
    last2: Forward iterator to the last element in the second range.
    
    Return Value: It returns an iterator to the first element of 
    the last occurrence of [first2,last2) in [first1,last1).
    If the sequence is not found or [first2,last2) is empty,
    the function returns last1.
    

    // C++ program to demonstrate the use of std::find_end
    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
    int main()
    {
        // Defining first container
        vector<int>v = {1, 3, 10, 3, 10, 1, 3, 3, 10, 7, 8, 
                        1, 3, 10};
      
        // Defining second container
        vector<int>v1 = {1, 3, 10};
      
        vector<int>::iterator ip;
          
        // Using std::find_end
        ip = std::find_end(v.begin(), v.end(), v1.begin(),
                           v1.end());
      
        // Displaying the index where the last common occurrence 
        // begins
        cout << (ip - v.begin()) << "\n";
        return 0;
    }

    Producción:

    11
    
  2. Al comparar usando una función predefinida:

    Sintaxis:

    Template
       ForwardIterator1 find_end (ForwardIterator1 first1, ForwardIterator1 last1,
                                  ForwardIterator2 first2, ForwardIterator2 last2,
                                  BinaryPredicate pred);
    
    Here, first1, last1, first2, and last2 are
    the same as the previous case.
    
    Pred: Binary function that accepts two elements
    as arguments (one of each of the two sequences, in the same order),
    and returns a value convertible to bool. 
    The value returned indicates whether the elements are considered
    to match in the context of this function.
    The function shall not modify any of its arguments.
    This can either be a function pointer or a function object.
    
    
    Return Value: It returns an iterator to the first element of
    the last occurrence of [first2,last2) in [first1,last1).
    If the sequence is not found or [first2,last2) is empty, 
    the function returns last1.

    // C++ program to demonstrate the use of std::find_end
    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
      
    // Defining the BinaryFunction
    bool Pred (int a, int b)
    {
        return (a == b);
    }
    int main()
    {
        // Defining first container
        vector<int>v = {1, 5, 7, 11, 13, 15, 30, 30, 7} , i;
      
        // Defining second container
        vector<int>v1 = {13, 15};
      
        vector<int>::iterator ip;
          
        // Using std::find_end
        ip = std::find_end(v.begin(), v.end(), v1.begin(), 
                           v1.end(), Pred);
      
        // Displaying the index where the last common occurrence
        // begins
        cout << (ip - v.begin()) << "\n";
      
        return 0;
    }

    Producción:

    4
    

Donde puede ser usado ?

  1. Para buscar desde el final: es la variante inversa de std::search , es decir, std::search busca una subsecuencia desde el principio de la lista, de modo que puede devolver la primera aparición de esa subsecuencia.

    Por otro lado, std::find_end puede usarse si queremos buscar una subsecuencia desde el final de la lista, que automáticamente será la última aparición de cualquier subsecuencia dentro de un contenedor.
    (¡¡No estás solo si estás pensando por qué se llama std::find_end y no std::search_end!!!)

    Por lo tanto, es un posible reemplazo de std::search , si la búsqueda debe realizarse desde el final.

    // C++ program to demonstrate the use of std::find_end
       
    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    int main()
    {
        int i, j;
       
        // Declaring the sequence to be searched into
        vector<int> v1 = { 1, 2, 3, 4, 5, 6, 7, 3, 4, 5 };
       
        // Declaring the subsequence to be searched for
        vector<int> v2 = {3, 4};
       
        // Declaring an iterator for storing the returning pointer
        vector<int>::iterator i1;
       
        // Using std::search to find the first occurrence of v2
        i1 = std::search(v1.begin(), v1.end(), v2.begin(), 
                         v2.end());
       
        // checking if iterator i1 contains end pointer of v1 or
        // not
        if (i1 != v1.end()) {
            cout << "vector2 is present firstly at index " 
                 << (i1 - v1.begin());
        } else {
            cout << "vector2 is not present in vector1";
        }
      
        // Using std::find_end to find the last occurrence of v2
        i1 = std::find_end(v1.begin(), v1.end(), v2.begin(), 
                           v2.end());
       
        // checking if iterator i1 contains end pointer of v1 or 
        //not
        if (i1 != v1.end()) {
            cout << "\nvector2 is present lastly at index " 
                 << (i1 - v1.begin());
        } else {
            cout << "vector2 is not present in vector1";
        }
        return 0;
    }

    Producción:

    vector2 is present firstly at index 2
    vector2 is present lastly at index 7
    
  2. Para encontrar la última aparición de un elemento que satisfaga una condición: dado que std::find_end comienza a buscar desde el final, podemos usar este hecho y manipular BinaryFunction para resolver preguntas que nos exigen encontrar la última aparición de algo (como last número impar, último número par, etc.).

    // C++ program to find the last occurrence of an odd
    // and even number
    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
      
    // Defining the Predicate Function to find the last occurrence
    // of an odd number
    bool pred( int a, int b)
    {
        if (a % b != 0) {
            return 1;
        } else {
            return 0;
        }
    }
      
    // Defining the Predicate Function to find the last occurrence
    // of an even number
    bool pred1( int a, int b)
    {
        if (a % b == 0) {
            return 1;
        } else {
            return 0;
        }
    }
      
    int main()
    {
      
        // Defining a vector
        vector<int>v1 = {1, 3, 4, 5, 6, 7, 8, 10};
          
        // Declaring a sub-sequence
        vector<int>v2 = {2};
           
        // Using std::find_end to find the last occurrence of an
        // odd number
        vector<int>::iterator ip;
        ip = std::find_end(v1.begin(), v1.end(), v2.begin(),
                           v2.end(), pred);
       
        // Displaying the index where the last odd number occurred
        cout << "Last odd no. occurs at " <<  (ip - v1.begin());
      
      
        // Using std::find_end to find the last occurrence of an 
        // even number
        ip = std::find_end(v1.begin(), v1.end(), v2.begin(),
                           v2.end(), pred1);
       
        // Displaying the index where the last even number occurred
        cout << "\nLast even no. occurs at " <<  (ip - v1.begin());
      
        return 0;
    }

    Producción:

    Last odd no. occurs at 5
    Last even no. occurs at 7
    

    Explicación del código: aquí, hemos manipulado la Función binaria de modo que busca si el elemento en el primer contenedor es un múltiplo de los elementos en el segundo contenedor o no, y en el segundo contenedor hemos almacenado 2, así que con la ayuda de esto son capaces de encontrar la última aparición de un número par o impar.

Artículos relacionados:

Este artículo es una contribución de Mrigendra Singh . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *