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

orl*_*rlp 7 c++ stl allocator

在此上下文中T是某种类型,并且allocator是该类型的分配器对象.默认情况下,std::allocator<T>但这不一定是真的.

我有一大堆记忆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);
}
Run Code Online (Sandbox Code Playgroud)

对于这两个?

#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);
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*ica 6

根据这个解释,他们应该这样做,就像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);
Run Code Online (Sandbox Code Playgroud)

在20.4.4.2§1中,uninitialized_fill具有的效果

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

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