首页 > 后端开发 > C++ > C 11 的 `std::vector::resize()` 和 Boost.Container 的 `resize()` 如何处理未初始化的元素?

C 11 的 `std::vector::resize()` 和 Boost.Container 的 `resize()` 如何处理未初始化的元素?

Linda Hamilton
发布: 2024-11-30 09:15:14
原创
875 人浏览过

How Do C  11's `std::vector::resize()` and Boost.Container's `resize()`  Handle Uninitialized Elements?

C 11 和 Boost.Container 中的向量行为:处理未初始化的元素

在 C 应用程序中,向量通常用作临时缓冲区。为了确保足够的容量,这些向量通常会进行大小调整操作。在 C 03 中,std::vector::resize() 函数通过附加指定值的副本来扩展向量。虽然此方法会初始化未使用的元素,但当仅考虑向量大小时,效率可能会很低。

C 11 引入了 resize() 的两个重载:

  • resize(size_type n):执行值未使用元素的初始化。
  • resize(size_type n, const value_type & val):用副本初始化未使用的元素

Boost.Container 通过额外的重载进一步扩展了此功能:

  • resize(size_type n, default_init_t):对未使用的元素执行默认初始化。

为了验证这些函数的行为,使用 C 11 进行了测试std::vector和 boost::container::vector:

  1. 用值 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 填充向量。
  2. 删除了一些元素以创建具有所需大小的向量 [0, 1, 2, 3, 4].
  3. 使用不同的 resize() 重载将向量大小调整为 10 个元素。
  4. 打印更新后的向量。

预期行为

对于 C 03 std::vector,未使用的元素应该用零初始化。 boost::container 变体预计在 C 03 模式下编译时模拟 C 03 行为,并在 C 11 模式下编译时表现出不同的行为。

实际结果

令人惊讶的是,测试结果显示 std::vector和 boost::container::vector表现出相同的行为。在所有情况下,无论使用了 resize() 重载,未使用的元素都初始化为零。

解释

这种意外行为表明 resize() 接口C 11 中引入的更改在给定场景中没有实际效果。 C 03 std::vector::resize() 函数默认初始化未使用的元素。在 C 11 中,resize() 重载为显式初始化提供了附加选项,但它们不会改变默认初始化未使用元素的默认行为。 Boost.Container 实现中也反映了相同的行为。

含义

如果需要避免用零初始化未使用的元素,可以使用自定义分配器来拦截 std::allocator 的 construct() 方法并用默认初始化替换值初始化。但是,请谨慎行事,因为将其应用于所有初始化可能会导致意想不到的后果。

以上是C 11 的 `std::vector::resize()` 和 Boost.Container 的 `resize()` 如何处理未初始化的元素?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板