2011-08-06 8 views
3

私に必要なのは、オブジェクトのいくつかのよく知られたパラメータを保持するためのキー値コンテナです。可能なすべてのキーはコンパイル時に認識されます。値はPOD(整数、ポインタ)と非POD(コンストラクタを持ついくつかの小さな構造)という異なる型に属します。可変型の値を持つC++のキー値コンテナ

現在の実装では、非常に大きな構造と大量のコードを使用して値を初期化、塗りつぶし、コピーします。だから私はこの構造体をコンテナに置き換えたいと思っています。コンテナは以下を提供する必要があります: 1)キーによるクイックアクセス(一定時間)。 2)すべての値を反復してコピーする可能性。

私はいくつかの配列ベースのアプローチを考えることを試みたが、冷たくない。私はいくつかのハッシュテーブルを作ることができますが、私は異なる値の型で何をすべきか分かりません。

+0

あなたは 'すべての可能なキーはコンパイル時に知られています 'と言った場合、*型*も知っている必要があります。キーの*タイプ*はなぜですか? – Nawaz

答えて

2

値を格納するには、Boost.Variantを参照してください。次に、コンテナにstd::map<Key, boost::variant>またはstd::unordered_map<Key, boost::variant>を使用するだけです。

+0

ありがとうございます。私はBoostについて知らなかった.Variant。 – pashkoff

0

std::mapのような音は正しい方法です。

キーがコンパイル時にわかっている間は、初期化の一環としてデータをstd :: map構造体に設定することができます。

値としては、int、ポインタ、および単純な非PODオブジェクトを保持できるラッパーオブジェクトを実装し、次にそのオブジェクトをstd :: hashの2番目の(値)オブジェクトにしたいとします。表。 ::iteratorさん

4

のための高速検索と.begin().end()ため

のstd ::マップ、inplements .find(key)std::unordered_map(またはboost::unordered_map)のように聞こえる適切なソリューションです。オブジェクトにはboost::anyを使用するだけで、どのようなタイプでもかまいません。

0

あなたは言った:

を可能なすべてのキーはコンパイル時に知られています。

タイプも知っている必要があります。

場合タイプは、整数型、配列boost::anyが最良の選択であるかポインタです。あなたが(配列やポインタ)を使用するものは何でも

//if the size is known at compile time! 
boost::any objmap[size]; 

//if the size isn't known at compile time 
boost::any *objmap = new boost::any[size]; 

キーキーに関連付けられた値になりますobjmapobjmap[key]の指標となります。

+0

値の型は非同種です。 –

+0

@マークB:その場合、彼は値の型に 'boost :: any'を使うことができます。私も自分の投稿を編集しました。 – Nawaz

関連する問題