在此上下文中T是某种类型,并且allocator是该类型的分配器对象.默认情况下,std::allocator<T>但这不一定是真的.
我有一大堆记忆allocator.allocate(n).我也有一个容器con中T的对象(比如,一个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)
根据这个解释,他们应该这样做,就像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)
所以我认为这并没有为他们留下任何不同的行为空间.所以回答你的问题:是的,确实如此.
| 归档时间: |
|
| 查看次数: |
483 次 |
| 最近记录: |