在此上下文中,T是某种类型,而分配器是该类型的分配器对象.默认情况下,它是std :: allocator< T>但这不一定是真的.
我有一块allocator.allocate(n)获得的内存.我还有一个T对象的容器con(例如,std :: vector< T>).我想用T对象初始化那块内存.
存储块的位置存储在T *数据中.
这两个代码示例是否始终相同?
#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); }
解决方法
根据
this explanations他们应该这样做,因为allocator :: construct被称为构造对象而std :: uninitialized …也构造了对象.但是我不知道,在实现你自己的allocator :: construct时,标准是什么以及你有什么自由.
编辑:好的,C 03标准在第20.1.5节§2表32中说明,构造(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);
所以我认为这并没有为他们留下任何不同的行为空间.所以回答你的问题:是的,确实如此.