2012-02-23 94 views
6

在C++ 11中,std :: vector具有構造函數vector(size_type n),它將默認構造n項目,它可以與缺省的可構造,可移動,不可複製的類一起使用。爲什麼C++ 11中沒有vector(size_type n,const Allocator&alloc)?

然而,與所有其他載體的構造,沒有變種,需要一個allocator,我已經使出了以下內容:

// 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

聽起來像規範中的缺陷。如果其中一個不存在,請提交報告。 – 2012-02-23 22:34:18

+0

@NicolBolas是否有描述提交報告流程的文檔? – rkjnsn 2012-02-23 22:40:38

+0

沒關係。看我的帖子。 – 2012-02-23 22:41:31

回答

7

想過之後,它可能並不是一個缺陷。

有可能是allocator_typevalue_type是相反類型相同類型。在那種情況下,vector(3, alloc)會調用哪個函數?構造函數將默認值copy-initialize到所有元素中,還是需要大小和分配器的構造函數?這是不明確的,因此是編譯錯誤。

+0

Yikes!我不認爲我會想到這一點。 – rkjnsn 2012-02-23 22:45:09

+1

用['std :: allocator_arg'](http://en.cppreference.com/w/cpp/memory/allocator_arg)很容易解決,這已經在其他地方(例如'std :: tuple')中使用過了。分配器版本將是'vector(3,std :: allocator_arg,alloc)'。 – Xeo 2012-02-23 22:46:40

+3

標準庫通常必須避免在使用模板化參數的函數過載中使用相同數量的參數。例如,這就是爲什麼他們最終沒有引入可變性std :: max,而是使用帶有初始化程序列表的版本。可變版本將不可能以易於使用的方式實現,同時仍允許自定義比較。 – bames53 2012-02-23 22:59:38

6

第一,而不是你的reserve /循環啄,你可以簡單地使用resize實現你的想象構造函數會做什麼:

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

另一種選擇是使用size_type n構造函數的三個參數版本:

​​

雖然這實際上複製構建入元件,其可能或可能不被接受。

關於理由?不知道。可能被忽視了。

+0

謝謝。我知道我必須俯視一個更簡單的方法。 – rkjnsn 2012-02-23 22:46:06

相關問題