Parells: pair

Introducció

Una parella és un tipus de dades molt senzill que permet emmagatzemar juntes dues dades de qualsevol tipus.

L’aventatge d’utilitzar una parella enlloc d’una struct amb dos camps és purament de brevetat i conveniència, ja que les parelles ofereixen operacions de comparació mentre que les structs no.

Dit això, algunes estructures de dades més complicades de la llibreria estàndard de C++ utilitzen parelles, per tant és bo de saber com funcionen.

El tipus pair

La llibreria estàndard de C++ proporciona parells d’elements de tipus T1 i T2 amb el tipus pair<T1, T2>. Per usar-les, cal fer un #include <utility>. De forma simplificada, aquesta és la seva interfície:

template <typename T1, typename T2>
struct pair {
    T1 first;                               // Primer element
    T2 second;                              // Segon element
    pair(const& T1 fst, const T2& snd);     // Crea un parell ⟨fst, snd⟩
};

template <typename T1, typename T2>
bool operator== (const pair<T1, T2>& a, const pair<T1, T2>& b);
⋮       // i igualment tota la resta de comparadors (!=, <, >, <=, >=)

Una pair no és doncs altra cosa que una petita struct d’accés obert amb dos camps first i second i operacions de comparació sobre elles. Les comparacions funcionen lexicogràficament: primer es mira first i, només en cas d’empat, es mira second. El fet de disposar d’aquests comparadors és segurament el gran avantatge de les parelles respecte les structs, que no disposen per defecte d’aquestes operacions.

L’especificació completa de les parelles de C++ es pot trobar a cppreference.

Exemple: Coordenades

Suposem que volem definir un tipus Punt per emmagatzemar un punt a través de coordenades reals en dues dimensions. Una possible opció seria crear-se una estructura:

struct Punt {
    double x, y;
};

En aquest cas, donat un Punt p, podem accedir a p.x i p.y. Però donats dos punts p1 i p2 no podem saber si són iguals o no sense escriure codi addicional.

En canvi, definint un Punt com un parell de reals

using Punt = pair<double, double>;

ara haurem d’accedir a p.first i p.second però ja tindrem disponibles les operacions == i != per saber si són iguals o diferents. A més, també tindrem disponibles les operacions <, >, >=, >= per poder-los comparar.

En ambdós casos, es pot inicialitzar un punt amb aquesta notació:

Punt p = {2.5, 3.33};

però només amb pairs es pot fer

Punt p(2.5, 3.33);




Lliçons.jutge.org
Jordi Petit, Salvador Roura
Universitat Politècnica de Catalunya, 2023

Prohibit copiar. Tots els drets reservats.
No copy allowed. All rights reserved.