2011-10-25 9 views
1

Visual Studio 2010 SP1で、ネイティブライブラリ(TR1)を使用して、boost :: randomのドキュメントの最初の例の1つを実装しようとしています。VC2010でboost :: random :: discrete_distributionを初期化する

ライブラリーを使用する前に、VC2010のランダム関数を使用するだけでよいことを知りました。これらは、ブーストのように機能しますが、ここではネイティブ関数を使用できません。

問題はVC2010でdiscrete_distribution<>を初期化することです。 Boostでは、配列を取る:

double probabilities[] = 
{ 
    0.5, 0.1, 0.1, 0.1, 0.1, 0.1 
}; 
boost::random::discrete_distribution<> dist(probabilities); 

しかし、私はそれを供給すべきか分からない。

理由::ここで私は、コンパイル時に受信エラーがある 'のconstのstd :: tr1を:: discrete_distribution <> :: param_type' NOコンストラクタが取ることができなかった

に 'ダブル[6]' から変換することはできませんソースの種類、またはコンストラクタのオーバーロードの解決は

曖昧だった私は、これらの機能がVC2010に実装されているようなマルチプラットフォームの互換性を維持しながら、私はちょうどのものに建て使用できると思ったが、私が上にフォールバックする必要があるようですブーストクラスを使用します。

boost :: randomをVC2010の組み込みクラスと比較して、パフォーマンス上の罰則はありますか?

Boostライブラリは、現在ほとんどのC++コンパイラで実装されていますが、一般に推奨されていますか?

Non-working modified example using stdまた

Working original example using boost::random

は、何この行はboost doc pageに意味:

はここで働くと非作業コードの2 pastebinsですか?

ヒントコンパイラがstd :: initializer_listをサポートしている場合は、 はweightを直接使用してdiscrete_distributionを初期化できます。

答えて

0

VC2010のstd::tr1::discrete_distributionは、最新のC++ 11仕様(したがって、名前空間tr1)に準拠していない、まだそれを構築するためにすべての方法を提供していません。実際には、VC2010でそれを構築する唯一の方法は、デフォルトで初期化するか、またはN回呼び出されるジェネレータを提供することです。const param_type&をとるコンストラクタは基本的に同じ:http://msdn.microsoft.com/en-us/library/ee462364.aspx実際のC++ 11の仕様で

、つまり二つの入力イテレータを取り、あなたの2番目の質問に私たちをもたらしますstd::initializer_listを取る1、1 discrete_distributionのコンストラクタのための2つ以上のオーバーロードがあります。

ヒントコンパイラがstd :: initializer_listをサポートしている場合、discrete_distributionを直接ウェイトで初期化できます。

std::initializer_listは基本的にあなたはコンストラクタがとることによってだけでなく、配列やPODの構造体初期化リストで、だけでなく、より複雑なクラスタイプを初期化することができますことを、new C++11 featureあるstd::initializer_listは(彼らはまた以外の目的で使用することができます新しいオブジェクトを初期化します)。 Wikipediaのエントリーにはより多くの情報があり、アイデアはかなり単純ですので、ここでは詳しく説明しません。しかし、基本的には、代わりのがやっていることを意味します

double probabilities[] = 
{ 
    0.5, 0.1, 0.1, 0.1, 0.1, 0.1 
}; 
boost::random::discrete_distribution<> dist(probabilities); 

あなたがちょうどすることができます:コンストラクタのパラメータリスト内の

boost::random::discrete_distribution<> dist({0.5, 0.1, 0.1, 0.1, 0.1, 0.1}); 

コンストラクトはstd::initializer_list<double>を構築し、その後、boost::random::discrete_distribution<>コンストラクタに渡します。

VC2010がこれをまだサポートしていない理由は、VC2010がまだstd::initializer_listをサポートしていないためです(これは部分的なC++ 11のサポートにすぎません)。

VC2010の現在の実装であるstd::tr1::discrete_distributionはかなり不足しているようだが、それを初期化する唯一の方法はジェネレータ機能を介しているようだ。

C++ 11仕様に完全に準拠したコンパイラを使用していたとしても、Boostには依然としてlotが提供されています。 C++ 11は、あなたに提供するすべてのものを提供するものではありません。また、C++ 11を使用している場合は、完全に無効にする理由はありません。しかし、C++ 11コードを記述している場合は、ベンダー固有の最適化を持つ可能性があるため、ブーストバージョンで提供される機能のC++ 11相当のものを使用することは明らかです。

多くの人がC++ 11をC++ 11よりも選択しています。これは、C++ 11がすべての主要コンパイラメーカーによって完全にサポートされるまでかなりの時間がかかるので、このようなケースではC++ 11でも提供している機能はまだまだ非常に便利です。

関連する問題