std::swap_ranges en C++

std::swap se utiliza para intercambiar elementos entre dos contenedores. Una de sus variantes es std::swap_ranges, que como sugiere su nombre se usa para intercambiar los elementos dentro de un rango.

Simplemente intercambia los valores de cada uno de los elementos en el rango [first1, last1) con los de sus respectivos elementos en el rango que comienza en first2. Si observamos su funcionamiento interno, encontraremos que esta función en sí misma usa std::swap().

Sintaxis:

std::swap_ranges (ForwardIterator1 first1, ForwardIterator1 last1,
                  ForwardIterator2 first2);

Here, first1, last1 and first2 are forward iterators.
Returns: It returns an iterator to the last element swapped in the second sequence.
// C++ program to demonstrate 
// the use of std::swap_ranges
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
    // Declaring first vector
    vector<int> v1;
    int i;
      
    // v1 contains 0 1 2 3 4 5 6 7 8 9
    for (i = 0; i < 10; ++i) 
    {
        v1.push_back(i);
    }
      
  
    // Declaring second vector
    // v2 contains 100 100 100 100 100
    vector<int> v2(5, 100);
      
    // Performing swap
    std::swap_ranges(v1.begin() + 3, v1.begin() + 7, v2.begin());
  
    // Displaying v1 after swapping
    for (i = 0; i < 10; ++i) 
    {
        cout << v1[i] << " ";
    }
  
    cout << "\n";
      
    // Displaying v2 after swapping
    for (i = 0; i < 5; ++i) 
    {
        cout << v2[i] << " ";
    }
  
    return 0;
}

Producción:

0 1 2 100 100 100 100 7 8 9
3 4 5 6 100

Aquí, en este programa hemos intercambiado elementos desde v1 comenzando en v1.begin()+3 hasta v1.begin()+7, con los valores comenzando desde v2.begin(), así que en lugar de intercambiar todo el vector, han realizado el intercambio en un rango.

Donde puede ser usado ?
Puede usarse cuando tenemos que encontrar si un contenedor dado contiene el mismo elemento en su primera mitad y también en la segunda mitad, es decir, si ambas mitades son idénticas entre sí o no.

// C++ program to demonstrate 
// the use of std::swap_ranges
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
    // Here 5 is the central element and the two halves
    // on its either side contain the same elements 1 2 3 4
    vector<int> v1 = { 1, 2, 3, 4, 5, 1, 2, 3, 4 };
  
    int i;
  
    // Declaring second vector and making it equal to v1
    vector<int> v2 = v1;
  
    // Here there is no central element and the two halves
    // are 1 2 3 4 and 1 2 3 5 which are different
    vector<int> v3 = { 1, 2, 3, 4, 1, 2, 3, 5 };
      
  
    // Declaring fourth vector and making it equal to v3
    vector<int> v4 = v3;
  
    // Performing swap between two halves of vector v1
    if (v1.size() % 2 == 0)
        std::swap_ranges(v1.begin(), v1.begin() + (v1.size() / 2),
                        v1.begin() + v1.size() / 2);
  
    else
        std::swap_ranges(v1.begin(), v1.begin() + v1.size() / 2,
                        v1.begin() + (v1.size() / 2) + 1);
  
    if (v1 == v2) 
    {
        cout << "Yes";
    } else 
    {
        cout << "No";
    }
  
    // Now, Performing swap between two halves of vector v3
    if (v3.size() % 2 == 0)
        std::swap_ranges(v3.begin(), v3.begin() + (v3.size() / 2),
                        v3.begin() + v3.size() / 2);
  
    else
        std::swap_ranges(v3.begin(), v3.begin() + v3.size() / 2,
                        v3.begin() + (v3.size() / 2) + 1);
  
    cout << "\n";
  
    if (v3 == v4) 
    {
        cout << "Yes";
    } else 
    {
        cout << "No";
    }
  
    return 0;
}

Producción:

Yes
No

Explicación del código: Aquí, en este código, hemos declarado un vector y luego lo hemos asignado a otro vector, y luego en el primer vector, estamos intercambiando valores en la primera mitad con la segunda mitad dependiendo de si contiene un número impar. de elementos o no. Si después de intercambiar los valores, el nuevo primer vector es el mismo que el segundo vector (primer vector antiguo), esto significa que ambas mitades son iguales.

Entonces, en el primer vector 1 2 3 4 5 1 2 3 4, contiene el mismo elemento en ambas mitades, por lo que se imprime Sí, mientras que en el segundo vector 1 2 3 4 1 2 3 5, la segunda mitad contiene un elemento diferente que primera mitad, es decir, 4 en lugar de 5, por lo que se imprime No.

Complejidad temporal: Es lineal en la distancia entre el primero y el último.

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 *