8

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

我有一大块内存由allocator.allocate(n). 我还有一个对象容器conT例如 a 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);
}
4

2 回答 2

6

根据这个解释他们应该做同样的事情,就像allocator::construct说构造对象并且std::uninitialized...构造对象一样。但我不知道,在实施自己的标准时,标准到底说了些什么以及您有什么自由allocator::construct

编辑:好的,第 20.1.5 §2 表 32 中的 C++03 标准状态应该与(对于任何符合标准的分配器,不仅如此)construct(p,t)具有相同的效果。在 20.4.4.1 §1 中,这应该与new ((void*)p) T(t)std::allocatoruninitialized_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);

所以我认为这不会给他们留下任何表现不同的空间。所以回答你的问题:是的,确实如此。

于 2011-05-18T16:34:14.967 回答
0

C++ 入门第 5节第13.6.2 节:

.....
uninitialized_copy调用construct输入序列中的每个元素以将该元素“复制”到目标中。该算法使用迭代器取消引用运算符从输入序列中获取元素。因为我们传递了移动迭代器,解引用运算符产生一个右值引用,这意味着construct将使用移动构造函数来构造元素。
......

于 2020-04-20T13:00:07.743 回答