2012-02-23 13 views
6

C++ 11では、std :: vectorにコンストラクタvector(size_type n)があり、既定のコンストラクタnが用意されています。これはデフォルトのコンストラクタブルで移動可能なコピー可能クラスで使用できます。C++ 11にベクトル(size_type n、const Allocator&alloc)がないのはなぜですか?

しかし、他のすべてのベクトルのコンストラクタとは異なり、アロケータをとる一切の変異体が存在しない、と私は次のように頼っています

// 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)は標準から省略されましたか?

+0

仕様の不具合のようです。レポートがない場合は、レポートを提出してください。 –

+0

@ NicolBolasには、レポートを提出するプロセスを記述した文書がありますか? – rkjnsn

+0

気にしないでください。私のポストを参照してください。 –

答えて

7

結局、それを考えると、結局は不具合ではないかもしれません。

allocator_typeおよびvalue_typeは、逆と同じタイプである可能性があります。その場合、どの機能をvector(3, alloc)と呼びますか?すべての要素、またはサイズとアロケータをとるものにコピーイニシャライズするデフォルト値をとるコンストラクタ?それはあいまいなので、コンパイルエラーです。

+0

Yikes!私はそれを考えたことはないと思う。 – rkjnsn

+1

他の場所ですでに使用されている['std :: allocator_arg'](http://en.cppreference.com/w/cpp/memory/allocator_arg)で簡単に解決できます(例えば' std :: tuple'など)。アロケータのバージョンは 'vector(3、std :: allocator_arg、alloc)'になります。 – Xeo

+3

標準ライブラリは、多くの場合、テンプレート化されたパラメータを使用して関数のオーバーロードで同じ数のパラメータを使用することを避けなければなりません。たとえば、これは最終的にvariadic std :: maxを導入せず、代わりに初期化子リストを取るバージョンで行った理由です。 variadicバージョンは、使いやすい方法で実装するのは不可能でありながら、カスタム比較も可能です。 – bames53

6

まず、代わりにあなたのreserve /ループブツの、あなたは単にあなたの想像コンストラクタはどうなるのかを達成するためにresizeを使用することができます。

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

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

​​

これは実際が許容されるか、あってもなくてもよい要素にコンストラクトをコピーけれども。

理論的には?いい考えはありません。おそらく見落とされるでしょう。

+0

ありがとうございます。私は簡単な方法を見落とさなければならないことを知っていました。 – rkjnsn

関連する問題