C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – allocator.construct循环是否等于std :: uninitialized_copy?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在此上下文中,T是某种类型,而分配器是该类型的分配器对象.认情况下,它是std :: allocator< T>但这不一定是真的.

我有一块allocator.allocate(n)获得的内存.我还有一个T对象的容器con(例如,std :: vector< T>).我想用T对象初始化那块内存.

存储块的位置存储在T *数据中.

这两个代码示例是否始终相同?

@H_502_8@#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); }

对于这两个?

@H_502_8@#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应该具有相同的效果

@H_502_8@for (; first != last; ++result,++first) new (static_cast<void*>(&*result)) typename iterator_Traits<ForWARDIterator>::value_type(*first);

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

@H_502_8@for (; first != last; ++first) new (static_cast<void*>(&*first)) typename iterator_Traits<ForWARDIterator>::value_type(X);

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

大佬总结

以上是大佬教程为你收集整理的c – allocator.construct循环是否等于std :: uninitialized_copy?全部内容,希望文章能够帮你解决c – allocator.construct循环是否等于std :: uninitialized_copy?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。