std :: vector <bool> - 在专门化中没有data()函数?</bool>

时间:2014-03-19 00:52:03

标签: c++ vector boolean std

我尝试使用几乎所有其他data()专精中的std::vector功能,但我发现没有data()功能bool专业化。

文档说明:

  

专业化具有与非专业化相同的成员功能   向量,除了数据,emplace和emplace_back,不存在   在这个专业化。

这背后的技术原因是什么?为什么它不能简单地返回指向它的第一个元素?

2 个答案:

答案 0 :(得分:4)

std::vector<bool> is specialized for space-efficiency。它不提供data()功能。

你不能解决它的元素因为它们每个都是1位大小,并且机器上没有任何东西像指向单个位的指针。

  

std :: vector的空间效率(也是如此)   至于它是否完全优化)是实现定义。一   潜在的优化包括合并矢量元素   每个元素占用一个位而不是sizeof(bool)字节。

您可以使用

访问其元素
std::vector<bool>::reference
  

此嵌入类是非const成员返回的类型   直接访问其元素时的向量。它访问   具有模拟对bool的引用的接口的各个位。


通常data()会返回T*,此处为bool*不是,因为referencepointer类型是不是bool的引用和指针。例如,对于我的实现,位类型是typedef,用于无符号长

typedef unsigned long _Bit_type;

这是reference用于名为struct _Bit_reference的位的内容。这个结构由struct _Bit_iterator使用,它是元素的迭代器。您可以在此处看到取消引用此 iterator 并在此实现中获取std::vector<bool>元素的含义:

//  typedef unsigned long _Bit_type;
// struct _Bit_reference
// {
//   _Bit_type * _M_p;
// ...
// };
//  typedef _Bit_reference  reference;

reference
    _Bit_iterator::operator*() const
    { return reference(_M_p, 1UL << _M_offset); }

答案 1 :(得分:1)

对于特定位,不能引用data。也许你最好使用std::bitset<>而不是专门的std::vector<bool>(实际上归结为相当于std::vector<uint8_t>专业化。)