【问题标题】:vector<bool> constant member functionsvector<bool> 常量成员函数
【发布时间】:2015-08-18 23:11:00
【问题描述】:

Josuttis 书C++ 标准库第二版在 pg 282 中提到 vector&lt; bool &gt;

请注意,内部代理类型 reference 仅用于 vector 类型的非常量容器。元素访问的常量成员函数返回 const_reference 类型的值,这是 bool 的类型定义。

你能帮我理解上面的说法吗?因此,正如我对vector&lt;bool&gt; 的理解,由于通过operator[] 的访问无法访问一点,它返回一个代理引用类。那么为什么或如何对于常量成员函数返回一个类型是 bool 的别名(bool 的类型定义)?还是我理解的措辞有误?

【问题讨论】:

    标签: c++ templates vector stl


    【解决方案1】:

    代理的重点是你可以读取和写入一个值:

     std:vector<bool> v(1, false);
     v[0] = true;
     bool value = v[0];
    

    为了能够写入一个值,您需要某种目标来写入。通常,您可以只使用对该值的引用。但是,不存在对位的引用。因此,std::vector&lt;bool&gt; 返回的 proxy 包含一个对要存储位的字的引用(或指针),以及在设置时哪个位受到影响的一些指示,通常是字的掩码。

    当只读取一点时,读取时可以提取值。无需记住位置和位。因此,std::vector&lt;bool&gt; const 可以直接返回 bool 值。

    【讨论】:

    • 谢谢!为了进一步挖掘,由于 vector 将每个元素都作为位存储在内部,因此 const std::vector 的 operator[] 函数实际上是否将该位转换为等效的 bool (其大小为实现定义但可能假设 1 个字节)并如您所说返回 bool 值? (因此,换句话说,只需将 1 分配给 true 并将 0 位分配给 false 并以 bool 形式返回,它是在 operator[] 函数中完成的)。在非 const vec 元素访问的情况下,它返回一个 ref 代理,并且工作在 operator[] 之外由 operator bool() 完成?
    • @avish:是的。对于std::vector&lt;bool&gt; const,从表示中提取位是在从operator[]() 返回结果之前完成的。在std::vector&lt;bool&gt; 的情况下,可以读取或写入从operator[]() 返回的结果,但只有在operator[]() 返回后才能确定正在执行的操作。因此,代理需要保存附加信息。
    猜你喜欢
    • 2015-12-18
    • 2012-12-13
    • 2016-12-07
    • 1970-01-01
    • 2021-09-19
    • 2016-05-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多