为什么 vector 不是 STL 容器?

2023-12-31

Scott Meyers 的书第 18 条有效的 STL:改进标准模板库使用的 50 种具体方法说要避免vector <bool>因为它不是一个 STL 容器并且它不能真正容纳bools.

下面的代码:

vector <bool> v; 
bool *pb =&v[0];

无法编译,违反了 STL 容器的要求。

Error:

cannot convert 'std::vector<bool>::reference* {aka std::_Bit_reference*}' to 'bool*' in initialization

vector<T>::operator []返回类型应该是T&,但为什么这是一个特殊情况vector<bool>?

什么是vector<bool>真的由什么组成?

该项目进一步指出:

deque<bool> v; // is a STL container and it really contains bools

这可以用作替代品吗vector<bool>?

谁能解释一下吗?


出于空间优化的原因,C++ 标准(早至 C++98)明确调用vector<bool>作为一种特殊的标准容器,其中每个布尔值仅使用一位空间,而不是像普通布尔值那样使用一个字节(实现一种“动态位集”)。作为这种优化的交换,它不提供普通标准容器的所有功能和接口。

在这种情况下,由于您无法获取字节内位的地址,因此operator[]无法返回bool&而是返回一个代理对象,该对象允许操作有问题的特定位。由于这个代理对象不是bool&,您不能将其地址分配给bool*就像您对“普通”容器调用此类运算符的结果一样。反过来这意味着bool *pb =&v[0];不是有效的代码。

另一方面deque没有任何此类专门化,因此每个 bool 都占用一个字节,您可以获取从返回值的地址operator[].

最后请注意,MS 标准库实现(可以说)不是最佳的,因为它为双端队列使用了较小的块大小,这意味着使用双端队列作为替代品并不总是正确的答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 vector 不是 STL 容器? 的相关文章

随机推荐

  • Maatwebsite 导入在 ubuntu 中不起作用

    当我尝试在 Ubuntu 中的服务器上使用 Maatwebsite 3 1 版本导入 Excel 工作表时 出现此类错误 Error Maatwebsite Excel Exceptions NoTypeDetectedException
  • 节点 http 服务器每秒可以处理多少个请求而不需要对任何请求进行排队?

    有谁知道节点 http 服务器的基本单个实例每秒可以处理多少个请求 而无需排队任何请求 实际上 我需要编写一个nodejs应用程序 它应该能够在100毫秒内一致响应大约数千个传入请求 我正在尝试在 4 个 cpus 服务器中测试它并在集群模
  • 如何找到浏览器的代理设置?

    我正在为 Windows 编写一个命令行工具 它使用 libcurl 从互联网下载文件 显然 当用户位于代理服务器后面时 下载不起作用 因为需要配置代理 然而 我希望我的工具尽可能简单 并且不必给用户带来配置代理的负担 我的工具甚至没有配置
  • SELECT 类型查询是唯一可以嵌套的类型吗?

    是否可以将非选择查询 更新 插入 删除 嵌入到另一个查询中 类似于 选择内的插入 A single query select such and such from where insert into 基本答案 有CTEs 通用表表达式 ht
  • 如何从“workflow.Context”获取“context.Context”?

    我正在实现一个 Cadence 工作流程 需要使用以下命令调用函数context Context参数 我该如何获得context Context来自workflow Context 难道这只是一个问题ctx context Context
  • Unity HoloLens 应用程序作为 Windows 应用程序而不是 AR 执行

    我正在使用以下工具构建 HoloLens Unity 应用程序 统一 2018 3 14f1 视觉工作室 2017 Microsoft MixedReality Toolkit Unity Foundation v2 0 0 RC1 Ref
  • 动态表单上的 MVC 模型验证?

    我有以下模型 public class FileModel public int Id get set Required ErrorMessage Required StringLength 100 ErrorMessage Max is
  • 在 Android 中添加自定义字体到主题

    有没有办法在 Android 的主题中添加自定义字体 我读过了快速提示 自定义 Android 字体 http mobile tutsplus com tutorials android customize android fonts 但这
  • Uint8Array 到 ArrayBuffer

    所以我有一个 ArrayBuffer 它是我用新的 HTML5 文件阅读器作为 ArrayBuffer 读取的文件的文件内容 并且我可以通过执行以下操作将 ArrayBuffer 转换为 Uint8Array ab established
  • MVC Core2 中的 Ajax 调用错误请求

    我正在将一个网站折射到 MVC Core 2 对于我的大多数 Ajax 调用 我一直使用 Get 速记 没有任何问题 我有一个 AJAX 调用需要使用 ajax 并且由于某种原因我不断收到错误的请求错误 请记住 此代码当前正在 aspx 网
  • 如何更改列表视图文本颜色

    在我的应用程序中 我想更改列表视图文本颜色 在本例中 我使用 XML 文件进行列表视图 是否可以 如果是 请举例说明 性别 xml
  • C 中变量名后的冒号[重复]

    这个问题在这里已经有答案了 可能的重复 结构体声明中的冒号是什么意思 例如 1 7 16 或 32 https stackoverflow com questions 1604968 what does a colon in a struc
  • 如何在 Kotlin Flow 中过滤列表

    我正在使用替换当前的实现RxJava to Coroutines and Flow 我在使用一些时遇到一些问题Flow运营商 我正在尝试过滤 a 中的项目列表Flow在提供收集之前 Flow
  • Passport.authenticate() 使用 Promise 而不是自定义回调

    passport authenticate 我如何定义一个Promise而不是使用定制球背 如何使用passport authenticate 在这里引用 http www passportjs org docs authenticate
  • 如何使用变量名称将命名元素添加到 R 向量

    我想向向量 V 添加一个元素 例如 100 并使用变量 x 的值作为新元素的名称 我知道可以这样做 V c V 100 names V length V x 但我正在寻找一种简单的单行解决方案 如果有的话 我试过 V c V as name
  • 使用 C++ 中的 PCL 在同一窗口中查看多个点云

    我有两个点云 我想在同一个窗口中对其进行可视化 include
  • TFS 2010 通过文件系统构建发布

    我在 TFS 中有一个相当大的 MVC2 项目 它在签入时自动构建 持续集成 目前 完整构建的版本已转储到我们的开发 IIS 服务器上的网络共享上 Server wwwrootLatest TFS 当然会创建很多子文件夹 因为它只是进行构建
  • 类内递归

    我试图在类语句中放置一个递归公式 class SomeNode def init self a leng len a half leng 2 self firstnode a 0 0 self child1 SomeNode a i for
  • 从外部连接到在 docker 容器内运行的服务

    我有一个服务在 docker 容器 本地机器 中运行 我可以在 Ambari 服务配置中看到服务 URL 现在我想使用本地开发环境连接到该服务 我发现我可以连接到容器内的该 URL 但是当我在本地外部使用该 URL 时 连接被拒绝 Caus
  • 为什么 vector 不是 STL 容器?

    Scott Meyers 的书第 18 条有效的 STL 改进标准模板库使用的 50 种具体方法说要避免vector