Ludzie pragną czasami się rozstawać, żeby móc tęsknić, czekać i cieszyć się z powrotem.
Inne funkcje składowe
size_type priority_queue::size () const
• Zwraca bieżącą liczbę elementów.
• W celu sprawdzenia, czy kolejka jest pusta, używaj funkcji składowej o nazwie
empty(), ponieważ może ona działać szybciej.
bool priority_queue::empty () const
• Zwraca wartość logiczną, określającą, czy kolejka jest pusta (nie zawiera elementów).
• Funkcja składowa równoważna konstrukcji postaci priority_queue::size()
==0, lecz może działać od niej szybciej.
void priority_queue::push (const value_type& elem)
• Wstawia do kolejki kopię elementu określonego przez wartość elem.
const value_type& priority_queue::top () const
• Zwraca kolejny element kolejki priorytetowej. Będzie nim element posiadający naj-
większą wartość z wszystkich elementów kolejki. Jeśli istnieje więcej niż jeden taki
element, nie jest zdefiniowane, który z nich zostanie zwrócony.
• Przed wywołaniem funkcji składowej należy upewnić się, czy kolejka zawiera jakie-
kolwiek elementy (size()>0). W innym przypadku jej działanie jest nieokreślone.
void priority_queue::pop ()
• Usuwa kolejny element kolejki priorytetowej. Będzie nim element posiadający mak-
symalną wartość z wszystkich elementów kolejki. Jeśli istnieje więcej niż jeden taki
element, nie jest zdefiniowane, który z nich zostanie usunięty.
• Funkcja nie zwraca wartości. W celu przetworzenia kolejnego elementu musisz wcześniej wywołać funkcję składową top().
• Przed wywołaniem funkcji składowej należy upewnić się, czy stos zawiera jakiekolwiek elementy (size()>0). W innym przypadku jej działanie jest nieokreślone.
10.4. Kontener bitset
Kontenery typu bitset są tablicami o ustalonym rozmiarze, zawierającymi bity lub wartości logiczne. Są one przydatne do zarządzania zestawami znaczników, w przypadku
których odpowiednie zmienne mogą reprezentować dowolną kombinację znaczników.
Programy utworzone w języku C oraz starszych standardach języka C++ wykorzystują
zazwyczaj w charakterze tablic bitów zmienne typu long, manipulując nimi przy użyciu
operatorów bitowych w rodzaju &, | oraz ~. Klasa bitset posiada nad takim podejściem
422
10. KONTENERY SPECJALNE
tę przewagę, że może przechowywać dowolną liczbę bitów, jak również zawiera dodat-
kowe operatory, służące do zmiany stanu bitów. Na przykład możliwe jest przyporząd-
kowywanie pojedynczych bitów i odczytywanie oraz zapisywanie ich całych zestawów
poprzez użycie sekwencji zer i jedynek.
Zwróć uwagę na fakt, iż niemożliwa jest zmiana liczby bitów w danym kontenerze
bitset. Ich liczba określona jest jako parametr wzorca. Jeśli zachodzi potrzeba wykorzystania zmiennej liczby bitów lub wartości logicznych, możliwe jest wykorzystanie zmiennej typu vector
Klasa bitset zdefiniowana jest w pliku nagłówkowym
#include
W pliku nagłówkowym
namespace std {
template
class bitset;
}
W tym przypadku parametr nie jest określonym typem, lecz wartością całkowitą bez znaku (ta cecha języka została przedstawiona na stronie 26).
Wzorce posiadające różne argumenty stanowią różne typy danych. Możliwe jest po-
równywanie oraz łączenie kontenerów typu bitset zawierających tę samą liczbę bitów.
10.4.1. Przykłady użycia kontenerów bitset
Wykorzystanie kontenerów bitset
do przechowywania zestawu znaczników
Pierwszy przykład zastosowania klas bitset przedstawia sposób ich wykorzystania do
zarządzania zestawem znaczników. Każdy znacznik posiada wartość określoną za pomocą
typu wyliczeniowego. Wartość ta została wykorzystana do określenia pozycji bitu. W tym przykładzie bity reprezentują kolory. Dlatego też również każda wartość typu wyliczeniowego Color określa jeden kolor. Dzięki zastosowaniu klasy bitset możliwe jest wykorzystanie zmiennych, które mogą zawierać dowolną kombinację kolorów:
//cont/bitset1.cpp
#include
#include
using namespace std;
int main()
{
/* typ wyliczeniowy uzywany w klasie bitset
* - kazdy bit reprezentuje kolor
*/
enum Color { red, yellow, green, blue, white, black, ...,
numColors };
10.4. KONTENER BITSET
423
// tworzy kontener bitset dla wszystkich bitow (kolorow)
bitset
// ustawia bity dla dwoch kolorow
usedColors.set(red);
usedColors.set(blue);
// wypisuje informacje o niektorych danych przechowywanych
// w klasie bitset
cout << "wartosci bitowe uzytych kolorow: " << usedColors
<< endl;
cout << "liczba uzytych kolorow: " << usedColors.count()
<< endl;
cout << "wartosci bitowe niewykorzystanych kolorow: " << ~usedColors
<< endl;
// jesli zostal wykorzystany jakikolwiek kolor
if (usedColors.any()) {
// przejrzyj wszystkie kolory
for (int c = 0; c < numColors; ++c) {
// jesli wykorzystany zostal rzeczywisty kolor
if (usedColors[(Color)c]) {
//...
}
}
}
}
Wykorzystanie kontenerów bitset
do operacji wejścia-wyjścia korzystających z reprezentacji bitowych