2011-05-18 33 views
7

在這種情況下,T是某種類型,而allocator是該類型的分配器對象。默認情況下它是std::allocator<T>,但這不一定是正確的。一個allocator.construct循環是否等於std :: uninitialized_copy?

我有一塊由allocator.allocate(n)獲得的內存。我也有一個容器conT對象(比如說,一個std::vector<T>)。我想用T對象初始化那塊內存。

大塊內存的位置存儲在T* data中。

這兩個代碼示例總是相同嗎?

#include <memory> 

// example 1 
std::uninitialized_copy(con.begin(), con.end(), data) 

// example 2 
std::vector<T>::const_iterator in = con.begin(); 
for (T* out = data; in != con.end(); ++out, ++in) { 
    allocator.construct(out, *in); 
} 

對於這兩個?

#include <memory> 

T val = T(); // could be any T value 

// example 3 
std::uninitialized_fill(data, data + n, val) 

// example 4 
for (T* out = data; out != (data + n); ++out) { 
    allocator.construct(out, val); 
} 
+0

我認爲allocator.address需要一個對象(或引用一個)作爲參數(std :: allocator只是執行&x)。它不會返回最後分配的地址,正如您似乎認爲的那樣。 – 2011-05-18 16:23:51

+0

@Christian Rau:Woops,讓我按照我的代碼進行編輯。 – orlp 2011-05-18 16:25:00

+0

當你說完全相同時,你的意思是關於分配和初始化的內存,或者關於性能或其他內容? – steveo225 2011-05-18 17:40:29

回答

6

根據this explanations他們應該這樣做,因爲allocator::construct據說構造對象和std::uninitialized...還建的對象。但是我不知道,在實施你自己的allocator::construct時,標準說的是什麼以及你有什麼自由。

編輯:確定,C++ 03標準第20.1.5§2表32狀態,即construct(p,t)應該具有儘可能new ((void*)p) T(t)相同的效果(對於任何符合標準的分配器,不僅std::allocator)。而在20.4.4.1§1,那uninitialized_copy應該有作爲

for (; first != last; ++result, ++first) 
    new (static_cast<void*>(&*result)) 
      typename iterator_traits<ForwardIterator>::value_type(*first); 

和相同的效果20.4.4.2§1,即uninitialized_fill

for (; first != last; ++first) 
    new (static_cast<void*>(&*first)) 
      typename iterator_traits<ForwardIterator>::value_type(x); 

的效果所以我認爲那並不是」沒有留下任何空間讓他們表現不同。所以要回答你的問題:是的,它的確如此。

+0

是的,我也得到了這個,但我希望它更精確,最好用標準的引號。我自己製造一個容器,這可能非常關鍵。在這種情況下,我儘量遠離cppreference。 – orlp 2011-05-18 16:39:10

+0

@ nightcracker好吧,用標準的參考證明它。 – 2011-05-22 16:24:07

相關問題