为了账号安全,请及时绑定邮箱和手机立即绑定

数组的unique_ptr有什么用吗?

数组的unique_ptr有什么用吗?

C++
ibeautiful 2019-10-05 15:29:15
std::unique_ptr 支持数组,例如:std::unique_ptr<int[]> p(new int[10]);但是需要吗?也许使用std::vector或更方便std::array。您发现该构造有什么用吗?
查看完整描述

3 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

有些人甚至没有使用std::vector分配器,也不享受使用的奢侈。有些人需要一个动态大小的数组,所以std::array就不用了。有些人从其他已知返回数组的代码中获取数组。而且该代码不会被重写以返回a vector或其他内容。


通过允许unique_ptr<T[]>,您可以满足这些需求。


简而言之,您unique_ptr<T[]>在需要时使用。当替代品根本无法为您服务时。这是不得已的工具。


查看完整回答
反对 回复 2019-10-05
?
慕村9548890

TA贡献1884条经验 获得超4个赞

需要权衡,然后选择与您想要的解决方案匹配的解决方案。从我的头顶上:


初始尺寸


vector并unique_ptr<T[]>允许在运行时指定大小

array 仅允许在编译时指定大小

调整大小


array并且unique_ptr<T[]>不允许调整大小

vector 确实

存储


vector并将unique_ptr<T[]>数据存储在对象外部(通常在堆上)

array 将数据直接存储在对象中

复制中


array并vector允许复制

unique_ptr<T[]> 不允许复制

交换/移动


vector并unique_ptr<T[]>具有O(1)时间swap和移动操作

array具有O(n)次时间swap和移动操作,其中n是数组中元素的数量

指针/引用/迭代器无效


array 确保即使对象处于活动状态,指针,引用和迭代器也不会失效 swap()

unique_ptr<T[]>没有迭代器;指针和引用仅swap()在对象处于活动状态时才失效。(交换之后,指针指向交换对象所在的数组,因此在这种意义上它们仍然是“有效的”。)

vector 可能会使任何重新分配上的指针,引用和迭代器无效(并提供一些保证,即重新分配只能在某些操作上进行)。

与概念和算法的兼容性


array而且vector都是容器

unique_ptr<T[]> 不是容器

我确实必须承认,这似乎是基于策略设计进行某些重构的机会。


查看完整回答
反对 回复 2019-10-05
?
白板的微信

TA贡献1883条经验 获得超3个赞

可能使用a的原因之一unique_ptr是,如果您不想支付对数组进行值初始化的运行时成本。


std::vector<char> vec(1000000); // allocates AND value-initializes 1000000 chars


std::unique_ptr<char[]> p(new char[1000000]); // allocates storage for 1000000 chars

该std::vector构造函数和std::vector::resize()将值初始化T-但new不会做,如果T是一个POD。


请参见C ++ 11中的值初始化对象和std :: vector构造函数


请注意,这vector::reserve不是替代方案:在std :: vector :: reserve之后访问原始指针是否安全?


这是同样的原因,C程序员可能选择malloc了calloc。


查看完整回答
反对 回复 2019-10-05
  • 3 回答
  • 0 关注
  • 1580 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信