我有一个std::vector
named args
(我不知道编译时向量的大小)和不可移动类型NonMoveable
.
我想创建一个与 args 大小相同的向量,因此它等于{NonMovable(args[0], additional_arg), NonMovable(args[1], additional_arg), …, NonMovable(args.back(), additional_arg)}
以后我不需要改变向量的大小。我怎么做?
I can’t reserve()
then emplace_back()
因为emplace_back()
需要移动(以允许重新分配,这在我的情况下是不可能的)
我不想使用std::list
因为它不连续。
如果您希望元素是连续的,您可以使用旧的 2 倍动态数组构造:
// allocate a dynamic array
NonMoveable *mv = std::allocator<NonMoveable>().allocate(args.size());
// use inplace new to construct the NonMoveable elements
for (unsigned int i = 0; i < args.size(); i++) {
new(mv + i) NonMoveable(args[i], additional_arg);
}
... // use the dynamic array
// Explicitely delete the elements
for (unsigned int i = 0; i < args.size(); i++) {
mv[i].~NonMoveable();
}
// and de-allocate
std::allocator<NonMoveable>().deallocate(mv, args.size());
它相当 C 风格,但满足连续要求。当然,这应该封装在自定义容器中,以允许在容器销毁时自动销毁和取消分配。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)