pair (Estructura)
Una estructura que proporciona la capacidad de tratar dos objetos como uno solo.
Sintaxis
struct pair
{
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
constexpr pair();
pair(const pair&) = default;
pair(pair&&) = default;
constexpr pair(
const T1& Val1,
const T2& Val2);
template <class Other1, class Other2>
constexpr pair(const pair<Other1, Other2>& Right);
template <class Other1, class Other2>
constexpr pair(const pair <Other1 Val1, Other2 Val2>&& Right);
template <class Other1, class Other2>
constexpr pair(Other1&& Val1, Other2&& Val2);
template <class... Args1, class... Args2>
pair(piecewise_construct_t, tuple<Args1...> first_args, tuple<Args2...> second_args);
pair& operator=(const pair& p);
template<class U1, class U2> pair& operator=(const pair<U1, U2>& p);
pair& operator=(pair&& p) noexcept(see below );
template<class U1, class U2> pair& operator=(pair<U1, U2>&& p);
void swap(pair& p) noexcept(see below );
};
template<class T1, class T2>
pair(T1, T2) -> pair<T1, T2>;
Parámetros
Val1
Valor que inicializa el primer elemento de pair
.
Val2
Valor que inicializa el segundo elemento de pair
.
Right
Un par cuyos valores se deben usar para inicializar los elementos de otro par.
Valor devuelto
El primer constructor (predeterminado) inicializa el primer elemento del par en el valor predeterminado del tipo T1
y el segundo elemento en el valor predeterminado del tipo T2
. Se define si ambos tipos son default{_>-<_}constructible de forma predeterminada.
El segundo constructor inicializa el primer elemento del par en Val1 y el segundo, en Val2. Se define si ambos tipos son copy_constructible.
El tercer constructor (plantilla) inicializa el primer elemento del par en Right
. first y el segundo en Right
. second. Se define si ambos tipos del par se pueden construir a partir de los tipos de valor proporcionados.
El cuarto constructor inicializa el primer elemento del par en Val1 y el segundo en Val2 mediante el Declarador de referencia de Rvalue: &&. Se define si ambos tipos del par se pueden construir a partir de los tipos de valor proporcionados.
Comentarios
La estructura de plantilla almacena un par de objetos de tipo T1
y T2
respectivamente. El tipo first_type
es igual que el parámetro de plantilla T1
y el tipo second_type
, igual que el parámetro de plantilla T2
. Tanto T1
como T2
deben proporcionar únicamente un constructor predeterminado, un constructor de argumento único y un destructor. Todos los miembros del tipo pair
son públicos, porque el tipo se declara como un struct
en lugar de como una class
. Los dos usos más comunes para un par son como tipos devueltos para funciones que devuelven dos valores y como elementos para las clases de contenedor asociativo map (Clase) y multimap (Clase) que tienen una clave y un tipo de valor asociado a cada elemento. Este último cumple los requisitos de un contenedor asociativo de pares y tiene un tipo de valor con la forma pair< const key_type, mapped_type >
.
Ejemplo
// utility_pair.cpp
// compile with: /EHsc
#include <utility>
#include <map>
#include <iomanip>
#include <iostream>
int main( )
{
using namespace std;
// Using the constructor to declare and initialize a pair
pair <int, double> p1 ( 10, 1.1e-2 );
// Compare using the helper function to declare and initialize a pair
pair <int, double> p2;
p2 = make_pair ( 10, 2.22e-1 );
// Making a copy of a pair
pair <int, double> p3 ( p1 );
cout.precision ( 3 );
cout << "The pair p1 is: ( " << p1.first << ", "
<< p1.second << " )." << endl;
cout << "The pair p2 is: ( " << p2.first << ", "
<< p2.second << " )." << endl;
cout << "The pair p3 is: ( " << p3.first << ", "
<< p3.second << " )." << endl;
// Using a pair for a map element
map <int, int> m1;
map <int, int>::iterator m1_Iter;
typedef pair <int, int> Map_Int_Pair;
m1.insert ( Map_Int_Pair ( 1, 10 ) );
m1.insert ( Map_Int_Pair ( 2, 20 ) );
m1.insert ( Map_Int_Pair ( 3, 30 ) );
cout << "The element pairs of the map m1 are:";
for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )
cout << " ( " << m1_Iter -> first << ", "
<< m1_Iter -> second << " )";
cout << "." << endl;
// Using pair as a return type for a function
pair< map<int,int>::iterator, bool > pr1, pr2;
pr1 = m1.insert ( Map_Int_Pair ( 4, 40 ) );
pr2 = m1.insert ( Map_Int_Pair (1, 10 ) );
if( pr1.second == true )
{
cout << "The element (4,40) was inserted successfully in m1."
<< endl;
}
else
{
cout << "The element with a key value of\n"
<< " ( (pr1.first) -> first ) = " << ( pr1.first ) -> first
<< " is already in m1,\n so the insertion failed." << endl;
}
if( pr2.second == true )
{
cout << "The element (1,10) was inserted successfully in m1."
<< endl;
}
else
{
cout << "The element with a key value of\n"
<< " ( (pr2.first) -> first ) = " << ( pr2.first ) -> first
<< " is already in m1,\n so the insertion failed." << endl;
}
}
The pair p1 is: ( 10, 0.011 ).
The pair p2 is: ( 10, 0.222 ).
The pair p3 is: ( 10, 0.011 ).
The element pairs of the map m1 are: ( 1, 10 ) ( 2, 20 ) ( 3, 30 ).
The element (4,40) was inserted successfully in m1.
The element with a key value of
( (pr2.first) -> first ) = 1 is already in m1,
so the insertion failed.