Standard Template Library (STL) — ¨Ubersicht

Transcription

Standard Template Library (STL) — ¨Ubersicht
Standard Template Library (STL) — Übersicht
Eine gute Online-Referenz finden Sie unter http://www.sgi.com/tech/stl/; die dort beschriebene Bibliothek enthält auch einige über den C++-Standard hinausgehende Funktionen.
Einige Standardcontainer:
• list (doppelt verkettete Liste), vector (Feld) im Unterschied zu valarray (Modell eines
mathematischen Vektors)
• Assoziative Container: map (Abbildung, Repräsentation als Baum), set (Menge)
Um den jeweiligen Container nutzen zu können, muss die entsprechende Header-Datei eingebunden werden, die in der Regel den selben Namen wie der Container selber besitzt, z.B.
#include <set>.
Gemeinsames Konzept: Iteratoren werden gebraucht, um über die Einträge des Containers
zu iterieren.
• iterator: verhält sich wie ein Zeiger auf einen Eintrag. Eintrag kann gelesen und verändert
werden.
• const_iterator: verhält sich wie ein Zeiger auf einen konstanten Eintrag. Eintrag kann
nur gelesen, aber nicht verändert werden.
Elementfunktionen, die fast alle Containerklassen besitzen: Standardkonstruktor, Kopierkonstruktor, Destruktor, Zuweisungsoperator sowie
iterator
iterator
const_iterator
const_iterator
size_t
bool
void
begin();
end();
begin()
end()
size()
empty()
swap( Cont& c);
const;
const;
const;
const;
Einige spezielle Elementfunktionen der einzelnen Container:
template<class T> class list
{
...
public:
T&
front
();
T&
back
();
void push_front( const T& x);
void push_back ( const T& x);
void pop_front ();
void pop_back ();
iterator insert( iterator pos, const T& x);
iterator erase ( iterator pos);
void
remove( const T& value);
void sort ();
void unique();
void merge ( list& L);
...
};
1
Komplexität von insert und erase: O(1)
template<class T> class vector
{
...
public:
vector( size_t n);
vector( size_t n, const T& x);
T&
operator[] (size_t i);
const T& operator[] (size_t i) const;
T&
T&
void
void
front
();
back
();
push_back( const T& x);
pop_back ()
void clear ();
void resize ( size_t n);
void reserve( size_t n);
iterator insert( iterator pos, const T& x);
iterator erase ( iterator pos);
...
};
Komplexität von insert und erase: O(n) (!), Komplexität von operator[] O(1)
template<class KeyT, class DataT> class map
{
...
public:
pair<iterator,bool> insert( const T& x);
void
erase ( iterator pos);
size_t
erase ( const key_t& key);
void
clear ();
iterator
iterator
iterator
DataT&
...
find
(
lower_bound(
upper_bound(
operator[] (
const
const
const
const
KeyT&
KeyT&
KeyT&
KeyT&
key);
key);
key);
key);
};
Beachte: Der iterator gibt ein pair<KeyT,DataT> zurück, so dass man mit first auf den Schlüssel und
mit second auf den Eintrag zurückgreifen kann.
Die Elemente einer map werden nach dem Schlüssel sortiert abgespeichert. Damit ist das Suchen nach
Elementen besonders schnell. Beachte, dass im Unterschied zu einer multi_map verschiedene Einträge
stets verschiedene Schlüssel besitzen, die Schlüssel sind also eindeutig.
Komplexität von insert, erase, find, lower_bound, upper_bound, operator[]: O(log n)
2
template<class KeyT> class set
{
...
public:
pair<iterator,bool> insert( const T& x);
void
erase ( iterator pos);
size_t
erase ( const key_t& key);
void
clear ();
iterator find
( const KeyT& key);
iterator lower_bound( const KeyT& key);
iterator upper_bound( const KeyT& key);
...
};
Ein set verhält sich also ähnlich wie eine map, mit dem Unterschied, dass unter den Schlüsseln kein
Eintrag abgespeichert wird.
Die Elemente eines set werden nach dem Schlüssel sortiert abgespeichert. Damit ist das Suchen nach
Elementen besonders schnell. Beachte, dass im Unterschied zu einem multi_set verschiedene Einträge
stets verschiedene Schlüssel besitzen, die Schlüssel sind also eindeutig.
Komplexität von insert, erase, find, lower_bound, upper_bound: O(log n)
valarray ist Element der Standard C++ Numerics Library und sofern für Numeriker von besonderem
Interesse:
template<class T> class valarray
{
...
public:
valarray( size_t n);
valarray( const T& x, size_t n);
T
operator[] (size_t i)
const;
T&
operator[] (size_t i);
valarray<T> operator[] (const valarray<size_t>& idx) const;
size_t size ()
const;
void
resize( size_t n);
T sum() const;
T min() const;
T max() const;
valarray<T> shift( int n)
const;
valarray<T> apply( T func(T)) const;
...
};
Darüberhinaus gibt es etliche andere Operatoren wie +=, -= und zahlreiche Funktionen wie sin, cos usw.
3
Algorithmen: Durch Einbinden von algorithm können verschiedene Algorithmen genutzt werden, die
auf den Containern arbeiten und dabei regen Gebrauch von dem Konzept der Iteratoren machen. Dabei
wird oft ein Paar first, last von Iteratoren verwendet, um ein Tupel von Daten als halboffenes Intervall
zu repräsentieren: first zeigt auf das erste Element des Tupels, last zeigt auf die erste Position in der
Sequenz, die nicht mehr zu dem betrachteten Tupel gehört. Hier eine kleine Auswahl:
template <class IteratorT, class T>
void fill( IteratorT first, IteratorT last, const T& value);
template <class IteratorT, class T>
IteratorT find( IteratorT first, IteratorT last, const T& value);
template <class Iterator1T, class Iterator2T>
Iterator1T find_first_of( Iterator1T first1, Iterator1T last1,
Iterator2T first2, Iterator2T last2);
template <class IteratorT>
IteratorT min_element( IteratorT first, IteratorT last);
template <class IteratorT>
IteratorT max_element( IteratorT first, IteratorT last);
template <class IteratorT, class T>
IteratorT remove( IteratorT first, IteratorT last, const T& value);
template <class IteratorT, class T>
IteratorT replace( IteratorT first, IteratorT last,
const T& old_value, const T& new_value);
template <class IteratorT>
void sort( IteratorT first, IteratorT last);
Folgende Algorithmen setzen sortierte Sequenzen voraus:
template <class Iterator1T, class Iterator2T>
bool binary_search( Iterator1T first1, Iterator1T last1,
const T& value);
template <class Iterator1T, class Iterator2T>
bool includes( Iterator1T first1, Iterator1T last1,
Iterator2T first2, Iterator2T last2);
template <class IteratorT, class T>
IteratorT lower_bound( IteratorT first, IteratorT last, const T& value);
template <class IteratorT, class T>
IteratorT upper_bound( IteratorT first, IteratorT last, const T& value);
4