3 回答
TA贡献2080条经验 获得超4个赞
有些人甚至没有使用std::vector分配器,也不享受使用的奢侈。有些人需要一个动态大小的数组,所以std::array就不用了。有些人从其他已知返回数组的代码中获取数组。而且该代码不会被重写以返回a vector或其他内容。
通过允许unique_ptr<T[]>,您可以满足这些需求。
简而言之,您unique_ptr<T[]>在需要时使用。当替代品根本无法为您服务时。这是不得已的工具。
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[]> 不是容器
我确实必须承认,这似乎是基于策略设计进行某些重构的机会。
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。
- 3 回答
- 0 关注
- 1580 浏览
添加回答
举报