3

すべてのポインターの削除を処理するため、std::vector だけで boost::ptr_vector を使用しています。しかし、私がするとき:

ptr_vector<SoftLabelRandomTreeFunctor> functors;
functors.resize(number_of_functors);

SoftLabelRandomTreeFunctorデフォルトのコンストラクターがないと文句を言います。ただし、 * a自体のサイズではなく、 * number_of_functorsa へのポインターのサイズに合わせて十分に大きくする必要があるという印象を受けました。SoftLabelRandomTreeFunctornumber_of_functorsSoftLabelRandomTreeFunctor

4

2 に答える 2

3

私はBoostの経験があまりないので、私の答えは一粒の塩で考えてください. ただし、ドキュメントをざっと読んで、boost::ptr_vector(コメントから質問への次のように)あなたが望むことはこのようにすることができるはずだと思いました:

boost::ptr_vector< boost::nullable<SoftLabelRandomTreeFunctor> > functors;
functors.resize(number_of_functors, 0);

あなたが読んであなた自身の結論を出すための参考文献:

于 2012-11-14T19:10:47.277 に答える
1

あなたが書くときfunctors.resize(number_of_functors)、ベクトルのサイズを大きくして、number_of_functors内部に要素を含めることができます。ptr_vectorデフォルトでは値の保存が許可されていないためNULL、意味のあるデータを膨張した配列に入れる必要があります。new SoftLabelRandomTreeFunctor()この関数は、すべての新しい要素を呼び出すことを意図しており、そのためにデフォルトのコンストラクターが必要です。

NULL を許可したい場合はboost::nullable、Alexey Kukanov の回答と、マニュアルに含まれているチュートリアル ( (here) ) で提案されているものが必要です。

number_of_functorsただし、要素をセマンティックに作成せず、配列サイズを増やすことなく、要素に十分なメモリを予約するだけの場合は、必要nullableありません。代わりに呼び出す必要があります。

functors.reserve(number_of_functors)

この後、新しい要素を配置するときは、配列サイズを増やす必要があることに注意してください (例: 経由push_back)。push_backただし、サイズが を超えない限り、メモリの再割り当てが呼び出されないという保証がありますnumber_of_functors

于 2013-03-26T16:04:53.310 に答える