6

C ++ 11では、std :: vectorには、vector(size_type n)デフォルトで構築nアイテムを配置するコンストラクターがあります。これは、デフォルトの構築可能、移動可能、コピー不可能なクラスで使用できます。

ただし、他のすべてのベクトルコンストラクターとは異なり、アロケーターを使用するバリアントはありません。私は次のことに頼りました。

// Foo is default constructible and moveable, but not copyable
const int n = 10; // Want 10 default constructed Foos
std::vector<Foo, CustomAllocator> foos(allocator);
foos.reserve(n);
for (int i = 0; i < n; ++i)
   foos.emplace_back();

これを達成するためのより良い方法はありますか?vector(size_type n, const Allocator& alloc)規格から除外された特別な理由はありますか?

4

2 に答える 2

7

まず、reserve/ loopの代わりにresize、想像したコンストラクターが行うことを簡単に実行できます。

const int n = 10;
std::vector<Foo, Alloc> foos(allocator);
foo.resize(n);

size_type n別のオプションは、コンストラクターの3つの引数バージョンを使用することです。

const int n = 10;
std::vector<Foo, Alloc> foos(n, Foo(), allocator);

これは実際には構成要素を要素にコピーしますが、これは受け入れられる場合と受け入れられない場合があります。

理論的根拠について?わからない。おそらく見落とされています。

于 2012-02-23T22:34:11.447 に答える
7

考えてみれば、結局のところ欠陥ではないかもしれません。

allocator_typevalue_typeは逆に同じタイプである可能性があります。その場合、どの関数がvector(3, alloc)呼び出されますか?すべての要素にコピー初期化するためにデフォルト値をとるコンストラクター、またはサイズとアロケーターをとるコンストラクター?これはあいまいであり、したがってコンパイルエラーです。

于 2012-02-23T22:41:12.523 に答える