Uso de la estructura Pair en C++

Iniciado por KINGARZA, 26 Julio 2017, 09:44 AM

0 Miembros y 1 Visitante están viendo este tema.

KINGARZA

Hola a todos!
Quiero hacer una cola que guarde cinco valores y para ello estoy usando la estructura PAIR de c++, el problema esta en como acceder a estos elementos.

El codigo de abajo muestra como defino el estado y la cola de este tipo
Código (cpp) [Seleccionar]

#define Estado pair<int, pair<int, pair<int, pair<int, int> > > >
set<Estado>Cola;


Por ejemplo, se que para acceder al primer elemento es:
Código (cpp) [Seleccionar]

int a = (*Cola.begin()).first;


Para el segundo elemento es:
Código (cpp) [Seleccionar]

int a = (*Cola.begin()).second.first;


Podrias ayudarme por favor?

ivancea96

Lo primero, un set es una "lista" ordenada. ¿Cómo ordenas ese pair? Por este motivo, set no es lo que buscas. Si quieres una cola, puedes usar queue, o algo más genérico como vector o list.

Ahora, si lo quieres hacer con pairs, pues bien, así es como accedes a los elementos. Pero pair no está para eso. Es preferible que utilices un array o una estructura o clase para guardar esos 5 valores.

KINGARZA

Gracias por responder :laugh:, uso la estructura set, para evitar implementar una cola de prioridad con MIN. y pues como bien comentas los ordena de menor a mayor, ademas existe la priority_queue de la stl, pero este set me va mejor en rendimiento.

ivancea96

El caso es que en un set no se permiten elementos repetidos, que en el caso de una cola no es algo imposible. En fin, depende de lo que quieras hacer.
En cualquier caso, ¿cuál es la pregunta de este tema? ¿Cuál es el problema?

KINGARZA

#4
Mira lo que pasa es que estoy intentado resolver un problema tipo laberinto, en el cual quiero conocer en cada estado:
*la distancia recorrida,
*mi posición
*la posición del otro objeto
y como sabrás en este tipo de problema piden el camino mas corto, entonces lo que hago es poner así la estructura:
d, x, y, x2, y2
donde d =  distancia recorrida hasta ese momento, y como el set ordena de menor a mayor cumple la función que deseo.
Y en cuanto eso de que no permiten repeticiones no importa, pues tengo una matriz de casillas visitadas.

Mi pregunta inicial era como acceder a todos los elementos cuando uso 4 Pairs anidados?
(En base a este codigo que habia mostrado
Código (cpp) [Seleccionar]
#define Estado pair<int, pair<int, pair<int, pair<int, int> > > >
set<Estado>Cola;

)
Por cierto, buen Blog!! :-*

ivancea96

Pues tal y como lo pusiste al principio:
Cita de: KINGARZA en 26 Julio 2017, 09:44 AM
Por ejemplo, se que para acceder al primer elemento es:
Código (cpp) [Seleccionar]

int a = (*Cola.begin()).first;


Para el segundo elemento es:
Código (cpp) [Seleccionar]

int a = (*Cola.begin()).second.first;


Y etc. Es un pair dentro de un pair dentro de un pair (...).

Teniendo:
Código (cpp) [Seleccionar]
pair<int, pair<int, pair<int, pair<int, int> > > > &var = (*Cola.begin());

Sabemos que:
Código (cpp) [Seleccionar]
var.first == int
var.second == pair<int, pair<int, pair<int, int> > >
var.second.first == int
var.second.second == pair<int, pair<int, int> >
var.second.second.first == int

Y etc. Simplemente fíjate en qué es cada miembro. El primer second retorna un XXXXX. El segundo retorna un YYYYY.

Y acerca del tema de guardar los pair así, como verás, no es agradable. Has dicho que es una estructura de la forma: "d, x, y, x2, y2". Puedes hacer eso, una estructura o clase:
Código (cpp) [Seleccionar]
struct Estado{
    int d, x, y, x2, y2;
};


Así, en vez de var.second.second.first, usarías, por ejemplo, "var.y".
Ahora el problema es ordenarlo en el set. Para ello, el set requiere que el objeto tenga un operador "<". Así que hagámoslo:

Código (cpp) [Seleccionar]
struct Estado{
    int d, x, y, x2, y2;

    bool operator<(const Estado& estado){
        return d < estado.d;
    }
};


En fin, tanto pair como tuple son clases que se debería evitar utilizar salvo que sean realmente necesarias. Es mejor crear una clase con nombre y con campos cuyos nombres sean auto-explicativos.