Sortierte Assoziative Container der STL
Transcrição
Sortierte Assoziative Container der STL
Sortierte Assoziative Container der STL FB Informatik Prof. Dr. R.Nitsch Ö Elementzugriff O(log2N) • Speichern die Daten intern in einer Baumstruktur • Das mathematische Konzept einer Relation oder eine diskrete Abbildung wird mit map realisiert, das einer Menge mit set • multimap und multiset erlauben mehrfache identische Schlüssel Erklärung siehe STL-Algorithmen Container set<T> Zugriff O(log N) Einfügen / Löschen Beginn Mitte Ende O(1) O(1) O(1) multiset<T> O(log N) O(1) O(1) O(1) map<Key,T> O(log N) O(1) O(1) O(1) multimap<Key,T> O(log N) O(1) O(1) O(1) Iterator Iterator-Kategorie set<T>::iterator constant bidirectional1) set<T>::const_iterator constant bidirectional multiset<T>::iterator constant bidirectional1) multiset<T>::const_iterator constant bidirectional map<key,T>::iterator mutable bidirectional map<key,T>::const_iterator constant bidirectional multimap<Key,T>::const_iterator mutable bidirectional multimap<Key,T>::const_iterator constant bidirectional 1) Microsoft Visual C++ weicht hier vom Standard ab und realisiert "mutable bidirectional" Iteratoren / 05.01.2009 C++ Standard Template Library (STL) 25 Assoziativer Container map FB Informatik Prof. Dr. R.Nitsch • map speichert Paare von Daten und Schlüsseln Key Data • Die Schlüssel sind eindeutig, d.h. es gibt keine 2 Datensätze mit gleichem Schlüssel (keine Duplikate). MatrikelNr Sudent • Die assoziierten Daten werden durch direkte Angabe des Schlüssels gefunden. TelNr Name • Eine sortierte Anordnung der Schlüssel ist für den assoziativen Location Node Zugriff nicht erforderlich, aber vorteilhaft: Durch sortierte Anordnung der Schlüssel in map verbessert sich die Beispiele assoziierter Zugriffszeit ( O(logN) ) Daten im map-Element • Der Typ der gespeicherten Elemente ist pair<const Key, T> – Die Konstanz des Schlüssels gewährleistet, dass er nach dem Einfügen nicht mehr verändert werden kann. Dies würde die Sortierung zerstören. • Deklaration der Klasse in der STL template< class Key, class T, class Compare = std::less<Key> > class map { /*…*/ }; // Typ der Schlüssel // Typ der Daten // Typ des Sortierers // (Key::operator< ist voreingestellt) Anwendungsbeispiele folgen 05.01.2009 C++ Standard Template Library (STL) 26 Anwendungsbeispiel - Wörterbuch void main(void) { map< string, string > dictionary; FB Informatik Prof. Dr. R.Nitsch // Leeres Wörterbuch erzeugen dictionary.insert(pair<string,string>("Baum","tree")); // Eintrag aufnehmen dictionary.insert(pair<string,string>("Auto","car")); // noch ein Eintrag cout << dictionary["Baum"] << endl; // Assoziativer Zugriff map<string,string>::iterator iter = dictionary.begin(); for( ; iter!=dictionary.end(); ++iter ) cout << (*iter).first << ' ' << (*iter).second << endl; // Sortierte Ausgabe } tree Auto car Baum tree • Falls absteigende Sortierung gewünscht ist: class Comp { public: bool operator()(string s1,string s2) { return s2<s1; } }; void main(void) { Comp compare; map<string,string,Comp> dictionary(compare); // weiter wie oben } 05.01.2009 C++ Standard Template Library (STL) // Sortierte Ausgabe Buch book Auto car 27 Container map und multimap : Übersicht und Typdefinitionen FB Informatik Prof. Dr. R.Nitsch Typdefinitionen • map definiert folgende öffentlichen Datentypen key_type mapped_type Typ Key der Schlüsselwerte Typ T der zugeordneten Werte value_type pointer reference X::key_compare Typ der gespeicherten Werte, pair<const Key,T> entspricht pair<const Key,T>* entspricht pair<const Key,T>& Typ des Funktionsobjekts Compare, das die Sortierreihenfolge der Schlüssel festlegt Weitere Typen wie Sequenz-Container … map-Element Key T value_type Typ pair<Key,T> key_type mapped_type Fortsetzung des Beispiels: typedef dient hier der Abkürzung void main(void) { // wie bisher Achtung: Ist die Suche nach dem Schlüssel typedef map<string,string,Comp> MapType erfolglos, wird ein neues map-Element für cout << dictionary.size(); 2 diesen Schlüssel angelegt. Die Assoziierten MapType::key_type key = "Ei"; // Typ ist string Daten werden mit dem Standardkonstruktor cout << dictionary[key]; T() erzeugt (hier: string() ). cout << dictionary.size(); 3 dictionary[key] = "egg"; // Schreibender Zugriff auf assoziierte Daten MapType::mapped_type word; // Typ ist string Weitere Informationen zum Einfügen, Suchen und word = dictionary[key]; Löschen von Daten finden Sie hier: egg cout << word; Breymann: C++. S. 516 } http://www.cplusplus.com/reference/stl/map/ 05.01.2009 C++ Standard Template Library (STL) 28 Beispiel: Ein Telefonbuch mit class map FB Informatik Prof. Dr. R.Nitsch typedef map<string,long> PhoneMap; string ist der key_type und long ist der mapped_type typedef PhoneMap::value_type MapElement; MapElement entspricht jetzt pair<string,long> typedef dient hier der Abkürzung void main() { // Einfügen mit operator[ ] und insert: PhoneMap directory; directory.insert(MapElement("IRedViel",732457)); directory["HauMich"] = 163248; directory["BinDumm"] = 843756; directory.insert(MapElement("IRedViel",732458)); // 2. Telefon; wird nicht ausgeführt, weil Schlüssel // schon existiert // immer noch kein 2. Telefon. Überschreibt 1. Nummer directory["IRedViel"] = 732458; PhoneMap::const_iter iter = directory.begin(); const_iter weil read-only Zugriff ausreicht for( ; iter!=directory.end(); ++iter) // Sortierte Ausgabe: cout << (*iter).first << ' ' BinDumm 843756 HauMich 163248 IRedViel 732458 << iter->second << ' '; // Suchen im Telefonbuch … string name = "BinLaden"; // Suchen mit operator[ ]: // O( logN ) long number = directory[name]; // number = 0; Achtung: Suchfehler gibt es hier nicht!! Für "BinLaden" // existiert jetzt ein Eintrag. iter = directory.find(name) // Suchen mit Iterator und find // O( logN ) if( iter!=directory.end() ) // Prüfen, ob Iterator dereferenzierbar ist cout << (*iter).second; // O( 1 ) iterator find(k) liefert Iterator else auf gefundenen Eintrag oder "pastcout << name << " hat kein Telefon!" << endl; the-end" Iterator wenn nicht gefunden directory.erase(iter); // Leereintrag "BinLaden" wieder löschen } void erase(iter) löscht einzelnes Element an Position iter 05.01.2009 C++ Standard Template Library (STL) 29 Sortierter Assoziativer Container multimap FB Informatik Prof. Dr. R.Nitsch • Unterschiede zu map – Elemente mit identischem Schlüssel (Duplikate) dürfen mehrfach vorkommen. Die assiziierten Daten dürfen sich dabei durchaus unterscheiden (Beispiel: mehrere Telefonnummern unter gleichem Namen) – Es gibt keinen Indexoperator T& operator[ ](const key_type& k) 05.01.2009 C++ Standard Template Library (STL) 30 Sortierter Assoziativer Container set FB Informatik Prof. Dr. R.Nitsch • entspricht der Klasse map, nur dass Schlüssel und Daten zusammenfallen. • set speichert wie map keine Duplikate • set hat keinen Indexoperator. Einfügen nur mit insert(key) • Deklaration der Klasse in der STL void main(void) { set<string> names; // Einfügen mit insert names.insert("IchSchonWieder"); names.insert("BinSchlau"); names.insert("BinDumm"); set<string>::iterator iter = names.begin(); // Sortierte Ausgabe for( ; iter!=names.end(); ++iter ) BinDumm BinSchlau IchSchonWieder cout << *iter << endl; names.insert("IchSchonWieder"); // Duplikat nicht eingefügt. Wie erkennt man erfolgreiches Einfügen? pair<SetIter,bool> success; pair<iterator,bool> insert(key) success = names.insert("IchSchonWieder"); if(success.second==true) cout << *(success.first) << " eingefuegt"; Duplikat else cout << "Duplikat"; 31 C++ Standard Template Library (STL) }05.01.2009 Container set : Übersicht und Typdefinitionen FB Informatik Prof. Dr. R.Nitsch • Deklaration der Klasse in der STL template< class Key class Compare = std::less<Key> > class set { /*…*/ }; // Typ der Schlüssel // Typ des Sortierers // (Key::operator< ist voreingestellt) Definition eines set-Containers: set<Konto> myset; Typdefinitionen • set definiert folgende öffentlichen Datentypen key_type value_type pointer reference key_compare … Typ Key der Schlüsselwerte auch Typ Key, im Gegensatz zu map entspricht Key* entspricht Key& Typ Compare. Funktionsobjekt, das die Sortierreihenfolge der Schlüssel festlegt Weitere Typen wie Sequenz-Container set-Element Key value_type key_type Weitere Informationen: Weitere Informationen zum Einfügen, Suchen und Löschen von Daten finden Sie hier: http://www.cplusplus.com/reference/stl/set/ Breymann: C++. S. 523 05.01.2009 C++ Standard Template Library (STL) 32