5

リソースのリストを std::vector に保存したい場合があります。私が見ているように、私のオプションは次のとおりです。

  1. リソースにデフォルトのコンストラクターを与える
  2. それらをヒープオブジェクトとして保存します(共有ポインターでラップします)

オプション 1 は無効なリソースを構築することを可能にし、オプション 2 はヒープの使用を強制します。

ここにオプションがありませんか?

4

3 に答える 3

7

インスタンスのベクトルを持つデフォルトのコンストラクターは必要ありません。

唯一の制限は、クラスにデフォルトのコンストラクターがない場合、デフォルトの引数で vector::resize を使用できないことです。

vec.resize(20);  // requires default constructor

しかし、 vector::resize にデフォルトのオブジェクトを与えることができます:

std::vector<foo> vec;
vec.resize(20, foo(10));  // give a sample object since foo has not default constructor
于 2010-03-05T07:31:24.863 に答える
1

自明でないコンストラクターを持つオブジェクトをベクトルに格納できます。stl コンテナー内のオブジェクト ストアには、代入セマンティック (コピー コンストラクターと代入演算子) が必要です。

于 2010-03-05T07:31:53.507 に答える
1

3 番目のオプションは、Boost.PointerContainerを使用することです。ただし、オブジェクトは引き続き個別にヒープに割り当てられます。Johann がコメントしたように、std::vector は既にヒープを使用してオブジェクトを (連続して) 格納しているため、ヒープを完全に回避する方法はありません。

多くの場合、リソース (ミューテックス、I/O ストリームなど) にコピー セマンティクスを許可しても意味がありません。そのため、コピー コンストラクターと代入演算子を非公開にすることで、コピー不可にする必要があります。残念ながら、コピー不可の制限により、リソースを STL コンテナー内に値として直接格納することはできません。したがって、Boost.PointerContainer またはスマート ポインターのコンテナーのいずれかに頼る必要があります。Boost.PointerContainer ドキュメントのMotivationセクションでは、どちらを使用するのが好ましいかについて説明しています。

于 2010-03-05T14:54:00.927 に答える