<utilidad> en C++

Es un archivo de encabezado que contiene utilidades en dominios no relacionados. 

  • Pares : estos son los objetos que pueden contener dos tipos diferentes de valores. 
  • Enfoque relacional genérico : se utiliza para los operadores relacionales !=, >, = bajo un espacio de nombres específico: rel_ops. 
  • Función de intercambio genérica : esta es una definición estándar utilizada por defecto por los componentes de la biblioteca estándar para todos los tipos que no proporcionan su propia sobrecarga: intercambio.

Funciones: 

1. swap : Intercambia el valor de dos objetos.

C++

// CPP program to illustrate
// the use of swap function
#include <iostream>    
#include <utility>    
using namespace std;
 
// Driver Program
int main ()
{
 
    // a: _ _ _ _ (empty array in beginning)
    int a[4];        
     
    // Initializing, a: _ _ _ _ & b: 10 20 30 40
    int b[] = {10, 20, 30, 40};
     
    // After swapping, a: 10 20 30 40 & b: _ _ _ _
    swap(a, b);            
     
    cout << "a contains:";
    for (int i; i<4;i++)
        cout << a[i]<<endl;
     
    return 0;
}

Producción: 

a contains:10
20
30
40

2. make_pair : Construye un par con su primer elemento establecido en x y su segundo elemento establecido en y.

C++

// CPP program to illustrate
// the use of make_pair
#include <utility>    
#include <iostream>
using namespace std;
 
// Driver program
int main ()
{
     
    // Initializing the pair with int type
    pair <int, int> a;
    pair <int, int> b;
     
    // Use of the make_pair function
    a = make_pair (10, 20);
     
    // It's ok to write like this as implicit
    // conversion takes place from pair<double, char>
    b = make_pair (15.5, 'B');
     
    // Printing the first and second values of the pair
    cout << "a: " << a.first << ", " << a.second << endl;
    cout << "b: " << b.first << ", " << b.second << endl;
     
    return 0;
}

Producción:

a: 10, 20
b: 15, 66

3. mover : Se mueve como rvalue . move se usa para indicar que un objeto puede ser «mover de», es decir, permitir la transferencia de recursos de un objeto (para ser movido) a otro objeto.

C++

// CPP program to illustrate
// the use of move
#include <utility>    
#include <iostream>    
#include <vector>    
#include <string>    
using namespace std;
 
// Driver Program
int main ()
{
    string s = "Hello!!";
    string s1 = "I am a geek.";
    vector<string> gfg;
     
    // It copies 's' in gfg
    gfg.push_back (s);
     
    // It moves 's1' in the gfg(containing 's')
    gfg.push_back (move(s1));        
     
    cout << "gfg contains:";
    for (int i=0;i< gfg.size(); i++)
        cout << ' ' << gfg[i];
    cout<<endl;
     
    return 0;
}

Producción:

gfg contains: Hello!! I am a geek.

4. mover (rango de elementos) : Mueve los elementos en el rango [primero, último] al rango que comienza en el resultado. 
Después de esta operación, los elementos en el rango desde el que se movió aún contendrán valores válidos del tipo apropiado, pero no necesariamente los mismos valores que antes del movimiento.

C++

// CPP program to
// Illustrate the use of vector
// move range of elements
#include <iostream>
 
// for move (ranges)
#include <algorithm>
 
// for move (objects)
#include <utility>    
#include <vector>    
#include <string>
using namespace std;
 
// Driver program
int main ()
{
    vector<string> string1 = {"Hello!", "I", "am", "a", "geek"};
    vector<string> string2 (5);
     
    // moving ranges:
    cout << "Moving ranges...\n";
     
    // use of move i.e.it moves from first to last element in
    // string 1 to the string2 from it's(string 2) starting
    move ( string1.begin(), string1.begin()+5, string2.begin() );
     
    cout << "string1 contains " << string1.size()
                                << " elements\n";
     
    cout << "string2 contains " << string2.size()
                        << " elements(after moving):";
     
    for (int i=0; i<string2.size(); i++)
        cout << string2[i] << " ";
    cout << endl;
     
     
    return 0;
}

Producción:

Moving ranges...
string1 contains 5 elements
string2 contains 5 elements(after moving):Hello! I am a geek 

5. move_if_noexcept : Obtiene una referencia de valor r a su argumento si su constructor de movimientos no lanza excepciones, de lo contrario obtiene una referencia de valor l a su argumento.

C++

// CPP program to illustrate
// the use of move_if_noexcept
#include<iostream>
#include<utility>
using namespace std;
 
struct Bad
{
     
    Bad() {}
     
    // may throw
    Bad(Bad&&)
    {
        cout << "Throwing move constructor called"<<endl;
    }
     
    // may throw as well
    Bad(const Bad&)
    {
        cout << "Throwing copy constructor called"<<endl;
    }
};
 
struct Good
{
    Good() {}
     
    // will NOT throw
    Good(Good&&) noexcept
    {
        cout << "Non-throwing move constructor called"<<endl;
    }
     
    // will NOT throw
    Good(const Good&) noexcept
    {
        cout << "Non-throwing copy constructor called"<<endl;
    }
};
 
 
// Driver Program
int main()
{
    Good g;
    Bad b;
    Good g2 = move_if_noexcept(g);
    Bad b2 = move_if_noexcept(b);
}

Producción:

Non-throwing move constructor called
Throwing copy constructor called

6. decval : Devuelve una referencia rvalue sin hacer referencia a ningún objeto. 
Esta función selecciona el tipo de un argumento como una referencia de valor r si su constructor de movimiento nunca lanza, o alternativamente, como una referencia de valor l si el tipo es construible por copia. Si el tipo no es ninguno, la función devuelve un valor r, que se seleccionará para los tipos de solo movimiento (incluso si pueden arrojar). 
Algunas operaciones se pueden implementar moviendo o copiando objetos, generalmente moviendo para valores r y copiando para valores l: Mover es generalmente una operación más eficiente que copiar cuando el objeto ya no es necesario (como los valores r).

C++

// CPP program to illustrate
// the use of declval
#include <utility>
#include <iostream>
using namespace std;
 
//class
struct A
{
virtual int value() = 0;
};
 
// Class with constructor
class B : public A
{
    int val_;
    public:
    B(int i, int j):val_(i*j){}
    int value()
    {
        return val_;
         
    }
};
 
// Driver Program
int main()
{
    // int a
    decltype(declval<A>().value()) a;
     
    // int b
    decltype(declval<B>().value()) b;
         
    //same as constructor
    a = b = B(100, 20).value();
    cout << a << endl;
    return 0;
}

Producción:

2000

Este artículo es una contribución de Shambhavi Singh . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@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 *