2009-05-23 4 views
1

Ich benutzte die Liste, um Städte in eine Reise zu setzen. Dann iteriere ich über die Liste, um die Reiseroute anzuzeigen. Ich möchte die Städte mit dem Namen anstatt durch den Reiseauftrag zugreifen. Also, ich dachte ich könnte eine Karte anstelle einer Liste verwenden, aber der Schlüssel bestimmt die Reihenfolge. Ich möchte immer noch die Reihenfolge der Sequenz steuern, aber auf die Einträge mit einem Schlüssel zugreifen können.Reihenfolge wie eine Liste, aber Zugang durch einen Schlüssel?

Können diese Funktionen kombiniert werden? Gibt es einen Standardweg, um das zu adressieren?

#include <list> 
#include <iostream> 
struct City{ 
    City(std::string a_n, int a_d):name(a_n), duration(a_d){} 
    std::string name; 
    int duration; 
}; 
int main(){ 
    std::list<City*> trip; 
    trip.push_back(new City("NY", 5)); 
    trip.push_back(new City("LA", 2)); 
    for (std::list<City*>::iterator ii=trip.begin(); ii!=trip.end(); ++ii) 
     std::cout << (*ii)->name << " for " << (*ii)->duration << " days." <<std::endl; 
} 
+1

Sie sollten keine HTML-Tags verwenden, um SO-Posts zu formatieren. Um den Code zu formatieren, wählen Sie den gesamten Code mit der Maus aus und tippen Sie Strg-K. –

+0

Neil - Was ist die große Sache über HTML-Tags? Wenn es Sie beleidigt, dann können Sie den Beitrag bearbeiten und reparieren. Keine Notwendigkeit, sich darüber zu ärgern –

Antwort

5

Oft müssen Sie mehrere Listen und Karten erstellen. Der übliche Weg besteht darin, einen Zeiger auf die Städte in Ihrer Nach-Stadt-Nachschlagekarte von den Zeigern in Ihrer Liste zu speichern. Oder Sie können eine Klasse wie Boost.MultiIndex tun, was Sie wollen, was ich sagen würde, ist viel sauberer. Es skaliert auch viel besser und es gibt viel weniger Kesselplattencode, wenn Sie neue Indizes hinzufügen möchten. Es ist auch in der Regel more space and time efficient

typedef multi_index_container< 
    City, 
    indexed_by< 
    sequenced<>, //gives you a list like interface 
    ordered_unique<City, std::string, &City::name> //gives you a lookup by name like map 
    > 
> city_set; 
1

erstellen map<string,int> m;, wo die Werte sind Indizes zu einem vector<City>, zum Beispiel m["NY"] == 0 und m["LA"] == 1.

+1

Der Zugriff auf eine Liste über einen Index ist eine teure Operation. Eine Zuordnung von Name zu Iterator wäre sinnvoller. –

+0

In meiner Antwort wurde "Liste" in "Vektor" geändert. Danke, dass du das angesprochen hast. – pts

0

Verwenden Sie zwei Sammlungen:

  • Eine Liste der tatsächlichen Objekte in der Reihenfolge zu speichern, die Sie interessieren
  • Eine Map-Namen auf die Objekte abzubilden..
0

Die beste Lösung Boost.MultiIndex zu verwenden ist, obwohl das etwas aufwendigere ist. Leider habe ich jetzt keine Zeit mehr, Beispielcode zur Verfügung zu stellen. Es tut uns leid.

Verwandte Themen