std::find_first_of en C++

std::find_first_of se usa para comparar elementos entre dos contenedores. Compara todos los elementos en un rango [primero1, último1) con los elementos en el rango [primero2, último2), y si alguno de los elementos presentes en el segundo rango se encuentra en el primero, entonces devuelve un iterador a ese elemento.

Si hay más de un elemento común en ambos rangos, se devuelve un iterador al primer elemento común presente en el primer contenedor. En caso de que no haya ninguna coincidencia, se devuelve el iterador que apunta a last1.

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

  1. Comparando elementos usando ==:

    Sintaxis:

    Template
    ForwardIterator1 find_first_of(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 in [first1,last1) that is part of 
                  [first2,last2). If no matches are found or [first2,
                  last2) is empty, the function returns last1.
    

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

    Producción:

    1 
    3
    

    Aquí, en ambos vectores, el primer elemento común es 1 y para encontrar el segundo elemento común, hemos pasado el comienzo del primer rango como el elemento al lado del primer elemento común ya encontrado.

  2. Al comparar usando una función predefinida:

    Sintaxis:

    Template
       ForwardIterator1 find_first_of (ForwardIterator1 first1, 
                                       ForwardIterator1 last1,
                                       ForwardIterator2 first2, 
                                       ForwardIterator2 last2,
                                       BinaryPredicate pred);
    
    Here, first1, last1, first2 and last2 are the same as
    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 in [first1,last1) that is part of 
    [first2,last2). If no matches are found or [first2,last2) 
    is empty, the function returns last1.

    // C++ program to demonstrate
    // the use of std::find_first_of
    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
      
    // Defining the BinaryFunction
    bool Pred (int a, int b)
    {
        if ( a % b == 0) {
            return 1;
        } else {
            return 0;
        }
    }
    int main()
    {
        // Defining first container
        vector<int>v = {1, 5, 7, 11, 13, 15, 30, 30, 7} , i;
      
        // Defining second container
        vector<int>v1 = {2, 3, 4};
      
        vector<int>::iterator ip;
          
        // Using std::find_first_of
        ip = std::find_first_of(v.begin(), v.end(), v1.begin(),
                                v1.end(), Pred);
      
        // Displaying the first element satisfying Pred()
        cout << *ip << "\n";
      
        return 0;
    }

    Producción:

    15
    

    Aquí, hemos manipulado la función binaria de tal manera que estamos tratando de encontrar el primer número en el primer contenedor que es un múltiplo de cualquiera de los números en el segundo contenedor. Y en este caso, 15 resulta ser el primero, ya que es divisible por 3.

Posible aplicación: std::find_first_of se puede utilizar para encontrar la primera aparición de cualquiera de los elementos presentes en otro contenedor.

  1. Una posible aplicación de esto es encontrar la primera vocal en una oración.

    // C++ program to demonstrate the use of std::find_first_of
    #include<iostream>
    #include<vector>
    #include<string>
    #include<algorithm>
    using namespace std;
    int main()
    {
        // Defining first container
        string s1 = "You are reading about std::find_first_of";
      
        // Defining second container containing list of vowels
        string s2 = {'a', 'A', 'e', 'E', 'i', 'I', 'o', 'O'
                    'u', 'U'};
          
        // Using std::find_first_of to find first occurrence of
        // a vowel
        auto ip = std::find_first_of(s1.begin(),s1.end(),
                                     s2.begin(), s2.end());
      
        // Displaying the first vowel found
        cout << "First vowel found at index "<< (ip - s1.begin()) 
             << "\n";
        return 0;
    }

    Producción:

    First vowel found at index 1
    

    Explicación: std::find_first_of busca la primera aparición de cualquiera de los elementos del segundo contenedor en el primero, y de esta manera se encuentra la primera vocal presente en la oración.

  2. También se puede utilizar para encontrar los primeros números pares e impares presentes en la lista.

    // C++ program to find the first occurrence of an odd
    // and even number
    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
      
    // Defining the Predicate Function to find first 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 first 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_first_of to find the first 
        // occurrence of an odd number
        vector<int>::iterator ip;
        ip = std::find_first_of(v1.begin(), v1.end(), v2.begin(),
                           v2.end(), pred);
       
        // Displaying the index where the first odd number 
        // occurred
        cout << "First odd no. occurs at index " 
             <<  (ip - v1.begin());
      
      
        // Using std::find_first_of to find the last occurrence   
        // of an even number
        ip = std::find_first_of(v1.begin(), v1.end(), v2.begin(),
                           v2.end(), pred1);
       
        // Displaying the index where the first even number 
        // occurred
        cout << "\nFirst even no. occurs at index " 
             <<  (ip - v1.begin());
      
        return 0;
    }

    Producción:

    First odd no. occurs at index 0
    First even no. occurs at index 2
    

    Explicación: Aquí, hemos almacenado 2 en un contenedor y con la ayuda de la función de predicado, buscamos el primer número en el primer contenedor que no es divisible por 2 (para un número impar) y que es divisible por 2 (para un número par). número).

Complejidad temporal: O(n1 * n2), donde n1 es el número de elementos en el primer rango y n2 es el número de elementos en el segundo rango.

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 *