rango_igual en C++

std::equal_range se usa para encontrar el subrango dentro de un rango dado [primero, último] que tiene todos los elementos equivalentes a un valor dado. Devuelve el límite inicial y final de dicho subrango.

Esta función requiere que el rango se ordene o divida de acuerdo con alguna condición, de modo que todos los elementos para los que la condición se evalúe como verdadera estén a la izquierda del valor dado y el resto a su derecha.

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

  1. Comparando elementos usando <:

    Sintaxis:

    Template
    pair 
        equal_range (ForwardIterator first, ForwardIterator last, const T& val);
    
    first: Forward iterator to the first element in the range.
    last: Forward iterator to the last element in the range.
    val: Value of the subrange to search for in the range.
    
    Return Value: It returns a pair object, whose member pair::first 
    is an iterator to the lower bound of the subrange of equivalent 
    values, and pair::second its upper bound.
    If there is no element equivalent to val, then both first and 
    second points to the nearest element greater than val, or if val is
    greater than any other value, then both of them point to last.
    

    // C++ program to demonstrate the use of std::equal_range
    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    int main()
    {
        vector<int> v = { 10, 10, 30, 30, 30, 100, 10,
                          300, 300, 70, 70, 80 };
      
        // Declaring an iterator to store the
        // return value of std::equal_range
        std::pair<std::vector<int>::iterator,
                  std::vector<int>::iterator> ip;
      
        // Sorting the vector v
        sort(v.begin(), v.end());
        // v becomes 10 10 10 30 30 30 70 70 80 100 300 300
      
        // Using std::equal_range and comparing the elements
        // with 30
        ip = std::equal_range(v.begin(), v.begin() + 12, 30);
      
        // Displaying the subrange bounds
        cout << "30 is present in the sorted vector from index "
             << (ip.first - v.begin()) << " till "
             << (ip.second - v.begin());
      
        return 0;
    }

    Producción:

    30 is present in the sorted vector from index 3 till 6
    

    Explicación: Después de ordenar el vector v1, verificamos los límites dentro de los cuales está presente 30, es decir, desde el índice 3 hasta el índice 6.

  2. Al comparar usando una función predefinida:

    Sintaxis:

     pair 
        equal_range (ForwardIterator first, ForwardIterator last, 
                     const T& val, Compare comp);
    
    Here, first, last and val are the same as previous case.
    
    comp: Binary function that accepts two arguments of the type 
    pointed by ForwardIterator (and of type T), and returns a
    value convertible to bool. The value returned indicates 
    whether the first argument is considered to go before the
    second. 
    The function shall not modify any of its arguments.
    This can either be a function pointer or a function object.
    
    Return Value: It returns a pair object, whose member 
    pair::first is an iterator to the lower bound of the subrange 
    of equivalent values, and pair::second its upper bound. 
    If there is no element equivalent to val, then both first and
    second point to the nearest element greater than val,
    or if val is greater than any other value, then both
    of them point to last.
    

    // C++ program to demonstrate the use of std::equal_range
    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <vector>
    #include <functional>
    using namespace std;
      
    // Defining the BinaryFunction
    bool comp(int a, int b)
    {
        return (a > b);
    }
    int main()
    {
        vector<int> v = { 10, 10, 30, 30, 30, 100, 10,
                          300, 300, 70, 70, 80 };
      
        // Declaring an iterator to store the
        // return value of std::equal_range
        std::pair<std::vector<int>::iterator,
                  std::vector<int>::iterator> ip;
      
        // Sorting the vector v in descending order
        sort(v.begin(), v.end(), greater<int>());
        // v becomes 300 300 100 80 70 70 30 30 30 10 10 10
      
        // Using std::equal_range and comparing the elements
        // with 10
        ip = std::equal_range(v.begin(), v.begin() + 12, 10, comp);
      
        // Displaying the subrange bounds
        cout << "10 is present in the sorted vector from index "
             << (ip.first - v.begin()) << " till "
             << (ip.second - v.begin());
      
        return 0;
    }

    Producción:

    10 is present in the sorted vector from index 9 till 12
    

Donde puede ser usado ?

  1. std::lower_bound y std::upper_bound en un solo lugar: esta función se puede usar si queremos usar tanto std::lower_bound como std::upper_bound al mismo tiempo, ya que su primer puntero será el mismo que std::lower_bound y su segundo puntero será el mismo que std::upper_bound. Por lo tanto, no sirve de nada usarlos por separado, si tenemos std::equal_range.

    // C++ program to demonstrate the use of std::equal_range
    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    int main()
    {
        vector<int> v = { 1, 2, 3, 4, 5, 5, 6, 7 };
      
        // Declaring an iterator to store the
        // return value of std::equal_range
        std::pair<std::vector<int>::iterator,
                  std::vector<int>::iterator> ip;
      
        // Using std::equal_range and comparing the elements
        // with 5
        ip = std::equal_range(v.begin(), v.end(), 5);
      
        // Displaying the subrange bounds
        cout << "std::lower_bound should be equal to "
             << (ip.first - v.begin()) << " and std::upper_bound "
             << "should be equal to " << (ip.second - v.begin());
      
        vector<int>::iterator i1, i2;
      
        // Using std::lower_bound
        i1 = std::lower_bound(v.begin(), v.end(), 5);
        cout << "\nstd::lower_bound is = " << (i1 - v.begin());
      
        // Using std::upper_bound
        i2 = std::upper_bound(v.begin(), v.end(), 5);
        cout << "\nstd::upper_bound is = " << (i2 - v.begin());
      
        return 0;
    }

    Producción:

    std::lower_bound should be equal to 4 and 
    std::upper_bound should be equal to 6
    std::lower_bound is = 4
    std::upper_bound is = 6
    

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 *