1

私はリストを使用して都市を旅行に配置しました。次に、リストを繰り返し処理して、旅行の旅程を表示します。旅行順ではなく、名前で都市にアクセスしたいのですが。そのため、リストではなくマップを使用できると思いましたが、キーによって順序が決まります。シーケンスの順序を制御したいのですが、キーでエントリにアクセスできます。

これらの機能を組み合わせることができますか?これに対処するための標準的な方法はありますか?

#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;
}
4

4 に答える 4

5

多くの場合、複数のリストとマップを作成する必要があります。一般的な方法は、リスト内のポインターから都市別ルックアップ マップ内の都市へのポインターを格納することです。または、Boost.MultiIndexのようなクラスを使用して、必要なことを行うことができます。また、拡張性が大幅に向上し、新しいインデックスを追加する場合のボイラー プレート コードが大幅に削減されます。また、通常、スペースと時間の効率も高くなります

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;
于 2009-05-23T16:01:48.633 に答える
1

map<string,int> m;値が a へのインデックスである a を作成しますvector<City>(たとえばm["NY"] == 0、 and ) m["LA"] == 1

于 2009-05-23T15:59:04.263 に答える
0

最善の解決策は、Boost.MultiIndexを使用することですが、少し複雑です。残念ながら、サンプルコードを提供する時間がありません。ごめん。

于 2009-05-23T20:08:10.967 に答える
0

2 つのコレクションを使用します。

  • 関心のある順序で実際のオブジェクトを格納するリスト。
  • 名前をオブジェクトにマップするためのマップ。
于 2009-05-23T15:59:56.293 に答える