我尝试使用几乎所有其他data()
专精中的std::vector
功能,但我发现没有data()
功能bool
专业化。
文档说明:
专业化具有与非专业化相同的成员功能 向量,除了数据,emplace和emplace_back,不存在 在这个专业化。
这背后的技术原因是什么?为什么它不能简单地返回指向它的第一个元素?
答案 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*
但不是,因为reference
和pointer
类型是不是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>
专业化。)