Programowanie i algorytmy

Unie w C++ (union)

powrót

Unie w C++ to złożone struktury danych podobne do struktur. Różnią się one tylko tym, że w danej chwili można używać tylko jednego elementu składowego unii. Inaczej mówiąc, wszystkie składowe wykorzystują tą samą pamięć, której wielkość jest równa wielkości największego elementu unii.

Unie tworzymy tak samo jak struktury w C++:

union nazwa{
  typ pierwszy_element;
  typ drugi_element;
  ...
  typ n_ty_element;
};
 
 
int main()
{
  //tworzenie unii
  nazwa unia;
 
  //odwoływanie się do elementów
  unia.pierwszy_element = 0;
 
  return 0;
}
 

 

Do elementów składowych odwołujemy się za pomocą kropki, pamiętając, że w danej chwili można używać tylko jednej składowej.

Zastosowanie

Taką strukturę danych możemy stosować w sytuacjach, gdy nie jesteśmy pewni jakiego typu elementu w danej chwili będziemy potrzebować. Rozważmy przykład wyznaczający średnią arytmetyczną liczb całkowitych. Liczby, które pojawią się na wejściu będą całkowite, natomiast wynik już niekoniecznie. Żeby zainicjować taki typ danych wystarczy {tex}8{/tex} bajtów, tyle ile największy typ zastosowany w przykładowej unii:

#include<iostream>
#include<cstdlib>
using namespace std;
 
union liczba{
        int calkowita;
        long long dluga;
        double rzeczywista;
};
 
int main()
{
    liczba a, b, c, d;
 
    //unia zajmuje 8 bajtów tyle ile największy typ unii - double
    cout<<"Unia zajmuje "<<sizeof(liczba)
    <<" bajtów"<<endl; 
 
    cout<<"Podaj trzy liczby całkowite: ";
 
    cin>>a.calkowita>>b.calkowita>>c.calkowita;
 
    d.rzeczywista = double(a.calkowita+b.calkowita+c.calkowita)/3.0;
 
    cout<<"Średnia wczytanych liczb wynosi: "<<d.rzeczywista<<endl;
 
    system("pause");
    return 0;
}
 

 

Operator sizeof zwraca ilość bajtów danego obiektu. Dla struktury o tych samych składowych, sizeof zwróciłby {tex}24{/tex} bajty.

Unie mogą być składowymi innych obiektów takich jak struktur czy klas w C++:

#include<iostream>
#include<cstdlib>
using namespace std;
 
union liczba{
  int calkowita;
  double rzeczywista;
};
 
struct samochod{
  char marka[20];
  char model[20];
  int rocznik;
  liczba pojemnosc;
};
 
int main()
{
  samochod renault;
 
  cout<<"Podaj markę: ";
  cin>>renault.marka; //odwołujemy się za pomocą operatora "."
 
  cout<<"Podaj pojemnosc: ";
  cin>>renault.pojemnosc.rzeczywista; //odwołujemy się za pomocą operatora "."
 
  //wypisanie danych
  cout<<"Marka: "<<renault.marka<<endl;
  cout<<"Pojemność: "<<renault.pojemnosc.rzeczywista<<endl;
 
  system("pause");
  return 0;
}
 

 

Można tworzyć tablice unii - tak samo jak tablice struktur, oraz tworzyć wskaźnik na unię.