Plantillas de funciones not1 y not2 en C++ STL con ejemplos

Estas son funciones que toman objetos de función unaria y binaria (funtores) y devuelven el complemento de esos objetos de función. Puede usarse en programación competitiva para obtener el complemento de funciones binarias y unarias.

Estas funciones son muy útiles cuando escribir código para la función de complemento es más difícil o largo. Por ejemplo, si queremos eliminar consonantes de una string, podemos escribir una función unaria para isVowel y podemos usar su complemento en la función remove_if de STL .

  1. not1: esta función toma el objeto de función unario y devuelve su objeto de complemento. Aquí necesitamos definir argument_type para el funtor unario en nuestro funtor.

    Sintaxis:

    template <class Predicate> 
      unary_negate<Predicate> 
        not1 (const Predicate& pred)
    {
      return unary_negate<Predicate>(pred);
    }
    

    Parámetros: la función acepta un parámetro obligatorio pred que especifica el objeto de función unario que se va a negar.

    Valor devuelto: la función devuelve el objeto unario negado.

    Ejemplo:

    // C++ program to demonstrate
    // not1 function template
      
    #include <bits/stdc++.h>
    using namespace std;
      
    struct pred {
        bool operator()(const int i) const
        {
            return (i % 2 == 0);
        }
      
        // defines argument_type for unary functor
        // it is begin used by not1
        // as argument_type
        typedef int argument_type;
    };
      
    // Driver code
    int main()
    {
        vector<int> odd{ 1, 2, 3, 4, 5,
                         6, 7, 8, 9, 10 };
      
        // simple pred functor use
        // it removes even numbers
        auto end
            = remove_if(odd.begin(),
                        odd.end(),
                        pred());
      
        odd.resize(distance(odd.begin(), end));
      
        cout << "removal of even elements: ";
        for (int i = 0; i < odd.size(); i++) {
            cout << odd[i] << " ";
        }
        cout << "\n";
      
        vector<int> even{ 1, 2, 3, 4, 5,
                          6, 7, 8, 9, 10 };
      
        // complement of pred using not1
        // which removes odd numbers
        end
            = remove_if(even.begin(),
                        even.end(),
                        not1(pred()));
      
        even.resize(distance(even.begin(), end));
      
        cout << "removal of odd elements: ";
        for (int i = 0; i < even.size(); i++) {
            cout << even[i] << " ";
        }
      
        return 0;
    }
    Producción:

    removal of even elements: 1 3 5 7 9 
    removal of odd elements: 2 4 6 8 10
    
  2. not2: Esta función toma el funtor binario como argumento y devuelve el funtor complementario del mismo.

    Sintaxis:

    template <class Predicate> 
      binary_negate<Predicate> 
        not2 (const Predicate& pred)
    {
      return binary_negate<Predicate>(pred);
    }
    

    Parámetros: la función acepta un parámetro obligatorio pred que especifica el objeto de función binaria que se negará.

    Valor de retorno: la función devuelve el objeto binario negado.

    Ejemplo:

    // C++ program to demonstrate
    // not2 function template
      
    #include <bits/stdc++.h>
    using namespace std;
      
    int main()
    {
        vector<int> vec{ 4, 2, 7, 9, 3, 5, 10, 6 };
      
        // simple use of not2 just provide binary
        // functor and it will return it complement
        sort(vec.begin(), vec.end(), not2(less<int>()));
      
        for (int i = 0; i < vec.size(); i++) {
            cout << vec[i] << " ";
        }
        return 0;
    }
    Producción:

    10 9 7 6 5 4 3 2
    

    Referencias:

Publicación traducida automáticamente

Artículo escrito por Aakash_Panchal 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 *