c – allocator.construct循环是否等于std :: uninitialized_copy?

前端之家收集整理的这篇文章主要介绍了c – allocator.construct循环是否等于std :: uninitialized_copy?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_301_0@
在此上下文中,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);

所以我认为这并没有为他们留下任何不同的行为空间.所以回答你的问题:是的,确实如此.

猜你在找的C&C++相关文章