gpt4 book ai didi

c++ - 使用分配器构造函数的 uninitialized_X 函数?

转载 作者:行者123 更新时间:2023-11-28 04:24:53 24 4
gpt4 key购买 nike

uninitialized_value_construct的版本吗?使用分配器就地构造元素而不是放置 new?

下面是uninitialized_value_construct的原型(prototype)实现;但是我正在寻找一个分配器被传递的地方,所以我可以使用行 alloc.construct(std::addressof(*current)) 而不是 ::new (std::addressof (*current)).

template<class ForwardIt>
void uninitialized_value_construct(ForwardIt first, ForwardIt last)
{
using Value = typename std::iterator_traits<ForwardIt>::value_type;
ForwardIt current = first;
try {
for (; current != last; ++current) {
::new (static_cast<void*>(std::addressof(*current))) Value();
}
} catch (...) {
std::destroy(first, current);
throw;
}
}

在 C++20 中,有 uninitialized_construct_using_allocator但不清楚它的用途或使用方法。


编辑: 在与@NicolBolas 交谈后,我最终实现了这对函数(我希望它们在 std:: 中)。出于我的需要(并且不失一般性,我将为其他 uninitialized_X 函数执行此操作。

template<class Alloc, class ForwardIt, class Size, class AT = typename std::allocator_traits<Alloc>>
ForwardIt uninitialized_value_construct_n(Alloc& a, ForwardIt first, Size n){
using T = typename std::iterator_traits<ForwardIt>::value_type;
ForwardIt current = first;
try{
for(; n > 0; (void) ++current, --n)
AT::construct(a, std::addressof(*current), T());
// ::new (static_cast<void*>(std::addressof(*current))) T();
return current;
}catch(...){destroy(a, first, current); throw;}
}
template<class Alloc, class ForwardIt, typename AT = typename std::allocator_traits<Alloc> >
void destroy(Alloc& a, ForwardIt first, ForwardIt last){
for(; first != last; ++first)
AT::destroy(a, std::addressof(*first));
// destroy_at(std::addressof(*first));
}

最佳答案

遗憾的是,uninitialized_construct 没有远程版本这需要一个分配器。

至于什么uninitialized_construct_using_allocator是为了,它通过分配器构造具有给定参数的给定类型的单个对象。这可能看起来做起来微不足道(std::allocator_traits<Alloc>::construct(t, alloc, std::forward<Args>(args)...)),但它以分配器将正确传播到scoped_allocator的方式进行。那个用过T .这需要 bunch of techniques不为人所知且不易理解,因此有一个特定的功能可以做到这一点。

关于c++ - 使用分配器构造函数的 uninitialized_X 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54587534/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com