Pary i krotki w C++11

Standard C++98 wprowadził pierwszą klasę pair do zarządzania parami wartości, a standard C++03 klasę tuple do obsługi krotek. W standardzie C++ obie zostały rozbudowane.

Klasa pair

Klasa pair służy do przechowywania dwóch wartości. Trkatuje je jako jedność (jeden zestaw danych). Znajomość tej klasy jest bardzo przydatna, ponieważ używana jest ona w wielu miejscach Biblioteki Standardowej. Takie klasy, jak Map, multimap, unordered_map, unordered_multimap używają par do zarządzania swoimi elementami (parami klucz-wartość). Klasy pair używają także inne elementy STL, jak choćby funkcja minmax(), zwracjająca dwie wartości.
Użycie klasy pair musi być poprzedzone załączeniem nagłówka i daje duże możliwości, ponieważ można tworzyć, kopiować, przypisywać i porównywać pary wartości.

#include <iostream>
#include <utility>
#include <tuple>
using namespace std;

class Foo{
  public:
    Foo (tuple<int, float>){
        cout << "Foo::Foo(tuple)" << endl;
    }
    template <typename... Args>
    Foo (Args... args) {
        cout << "Foo::Foo(args...)" << endl;
    }
};

int main(){
    tuple<int,float> t(1,2.22);
    pair<int,Foo> p1 (42, t);
    pair<int,Foo> p2 (piecewise_construct, make_tuple(42), t);
}

Funkcja make_pair pozwala na stworzenie wartości pary bez jawnego deklarowania typów wartości.
Zatem zapis:

std::pair<int,string>(30,'Adam');

można zastąpić zapisem:

std::make_pair(30,'Adam');

a typy zostaną wydedukowane przez kompilator.

Klasa tuple

Pierwotnie klasa tuple była częścią biblioteki Boost. Krotka jest klasą służącą do przechowywania zróżnicowanej liczby elementów, o typach określonych podczas kompilacji programu. Klasa tuple rozszerza klasę pair pozwalajac na użycie dowolnej liczby elementów. Aby można było użyć klasy tuple, należy najpierw dołączyć nagłówek . Oto przykładowa krotka zawierająca imię, nazwisko, wiek oraz wzrost:

tuple<string,string,int,double> t1;

A tu przykład krotki z inicjalizacją oraz deklaracją:

tuple<string,string,int,double> t1(Jan,Kowalski,30,182.5);
include <tuple>
#include <iostream>
#include <complex>
#include <string>

using namespace std;

int main(){
    tuple<string,int,int,complex<double>> t;

    tuple<int,float,string> t1(41,6.3,"janek");

    cout << get<0>(t1) << " ";
    cout << get<1>(t1) << " ";
    cout << get<2>(t1) << " ";
    cout << endl;

    auto t2 = make_tuple(22,44,"janek");

    get<1>(t1) = get<1>(t2);

tuple<int,float,string> włącznie
    if (t1 < t2) {
        t1 = t2;   
    }
}

Możliwe są konwersje pomiędzy klasami tuple oraz pair. Można zainicjować dwuelementową krotkę jako parę, i analogicznie można przypisać dwuelementową parę do dwuelementowej krotki. Klasa pair udostępnia konstruktor służący do tego celu.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *