2009-05-23 5 views
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; 
} 
+1

あなたはSOの投稿をフォーマットするためにHTMLタグを使用しないでください。コードを書式設定するには、マウスですべてのコードを選択し、Ctrl-Kを押します。 –

+0

Neil - HTMLタグの大きな点は何ですか?それがあなたを怒らせる場合は、投稿を編集して修正してください。 –

答えて

5

多くの場合、複数のリストとマップを作成する必要があります。一般的な方法は、あなたのリスト内のポインタからあなたの都市別の参照マップの都市へのポインタを格納することです。または、Boost.MultiIndexのようなクラスを使用して、私が言うよりもはるかにクリーンなものをやり遂げることができます。また、新しいインデックスを追加したい場合は、スケーラビリティが向上し、ボイラープレートのコードが大幅に少なくなります。それはそれは少しより複雑だけれども、通常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

m["NY"] == 0m["LA"] == 1ため、値はvector<City>にインデックスされmap<string,int> m;を作成。

+1

インデックスを使用してリストにアクセスするのは、高価な操作です。イテレータへの名前のマップはより賢明でしょう。 –

+0

私の答えで 'list'を' vector'に変更しました。これを持っていただきありがとうございます。 – pts

0

使用2つのコレクション:

  • に興味がありますために、実際のオブジェクトを格納するためのリスト
  • オブジェクトに名前をマップするためのマップ。
0

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

関連する問題