vector<bool> 是否违反了容器要求?

4
在包含容器要求的表格中,C++标准草案n3242第23.2节声明,对于包含T的容器,X::reference必须是lvalue T。然而,对于vector,vector::reference是另一个类,它是用于访问存储在向量中的字节的单个位的代理。
这是否意味着,对于T=bool,在标准中定义的std::vector类模板规范未能满足容器要求?
4个回答

10

这是否意味着标准中定义的 std::vector 类模板规范对于 T = bool 无法满足容器要求?

是的。

同样地,它的迭代器不是真正的随机访问迭代器,因为 operator* 返回一个代理对象。

vector<bool> 很混乱。


并不是真的一团糟;它很方便,而且也能够正常工作。但处理向量的通用代码时确实需要小心。 - Pete Becker
8
事实上,最好不要专门使用“vector”,而是定义一个全新的类型。但事后诸葛亮。 - James McNellis

7

是的,正如这里所述,附有很好的解释。


好吧,这只是一个片面的解释。<g> 他没有赢得那场战斗。 - Pete Becker

4
是的,vector<bool>不符合容器要求。它并没有声称符合,尽管有一个相当明显的暗示。事实是,容器“要求”在任何正式意义上都不是要求;标准库中没有要求满足容器要求的类型。相反,“要求”是描述性的:每个容器的文档都可以说(就像vector<bool>的文档一样)“这个容器符合容器要求,除了......”。

1

是的,它确实如此。首先,它使用代理对象vector <bool> :: reference,它实际上不是引用,但只是看起来相同(它是一个类)。其次,它有其他向量没有的flip()方法。此外,它不支持转换为类似C的数组,而所有其他向量都支持:&vec [0]

因此,实际上vector< bool>不是向量,但看起来像向量,它的数据不是bool,但看起来像bool。这个容器被全球认为是“标准化但失败的东西”。


2
嗯,不,它并没有被全球公认为失败。 - Pete Becker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接